Changes between Version 1 and Version 2 of 参照型変数実装へ向けて
- Timestamp:
- Jan 28, 2007, 3:47:00 AM (18 years ago)
Legend:
- Unmodified
- Added
- Removed
- Modified
-
参照型変数実装へ向けて
v1 v2 10 10 これらの措置は下位互換を重視するのが目的ということもあるが、スコープ単位で生成・破棄が繰り返されるオブジェクトの寿命管理は、コード中のほとんどの箇所で利用したいモデルであることは間違いない。C#やJavaを採用した場合でも、GCが面倒を見てくれるからといってオブジェクトの使用範囲(寿命)を全く無視してコーディングしたほうが良いなどという推奨は誰もしないだろう。 11 11 12 実際問題、ABのデフォルトは値型なので、参照型を多用するようなプログラミングスタイルは推奨されない。もし、GCと組み合わせた参照型を推し進めるのであれば、それは下位互換を捨ててAB6などでやりたい課題である。 13 12 14 13 15 == ABの参照型変数のモデル == 14 16 15 * 実体生成はNew演算子によって行い、インスタンスの破棄はGCによって管理される。参照型変数に対してのDeleteは可能だが、コンパイラが警告を発する。16 * 参照型変数 は値渡し・参照渡し共に可能である。生成・破棄の手法が異なることを除き、一般的なローカルオブジェクトと扱いは変わらない。17 * 関数の戻り値として 、実体オブジェクト・参照型変数の違いはない。Returnステートメントに指定された値によって柔軟に対応する。17 * まずは、GCとの関係は切り離して考える。 18 * 参照型変数を更に値渡し・参照渡しすることが可能である。生成・破棄のアクションを自らが行わないだけであり、一般的なローカルオブジェクトと扱いは変わらない。 19 * 関数の戻り値として参照を持たせることができる。 18 20 19 ABの参照型変数の一番のメリットは、静的オブジェクトとの相性が良いことである。静的オブジェクトを参照することもできれば、参照先のインスタンスを静的オブジェクトにコピーすること だって可能だ。21 ABの参照型変数の一番のメリットは、静的オブジェクトとの相性が良いことである。静的オブジェクトを参照することもできれば、参照先のインスタンスを静的オブジェクトにコピーすることも可能だ。 20 22 21 それでは、"Function test() As Object" など、関数の戻り値にオブジェクトを指定したときこの戻り値は実態オブジェクトなのか、参照型オブジェクトなのか。。。 答えはどちらも正解である。23 それでは、"Function test() As Object" など、関数の戻り値にオブジェクトを指定したときこの戻り値は実態オブジェクトなのか、参照型オブジェクトなのか。。。正解は値型。ABのデフォルトは値型となっているので、参照を返したい場合は別途ByRef指定をしなければならない。 22 24 23 25 {{{ … … 29 31 30 32 Dim LocalObj As Object 31 Ref RefObj As Object32 33 LocalObj = test() 33 RefObj = test()34 Dim ByRef refObj = test() 34 35 }}} 35 36 36 上記のコードは、具体的に言えばtest関数内で定義される静的オブジェクトobjがLocalObjまたは RefObjにコピーされるというコードである。厳密に言えば、RefObjが参照しているのは、ヒープ領域に作成されたtest関数内のobjのコピーになる。37 上記のコードは、具体的に言えばtest関数内で定義される静的オブジェクトobjがLocalObjまたはrefObjにコピーされるというコードである。厳密に言えば、refObjが参照しているのは、ヒープ領域に作成されたtest関数内のobjのコピーになる(ヒープ領域に確保された一時オブジェクトはGCによって回収される実装にするため心配はいらない)。 37 38 38 39 では、オブジェクトインスタンスのコピーを一回の発生させることなく、スマートに関数の戻り値にオブジェクトを指定したいときはどのようにすれば良いのだろう。下記にコードを示す。 39 40 40 41 {{{ 41 Function test() As Object 42 Ref obj = New Object 43 ... 44 Return obj 42 Dim globalObj As Object 43 Function test() ByRef As Object 44 Return globalObj 45 45 End Function 46 46 47 Dim LocalObj As Object 48 Ref RefObj As Object 49 LocalObj = test() 50 RefObj = test() 47 Sub main() 48 Dim LocalObj As Object 49 LocalObj = test() 50 Dim ByRef refObj = test() 51 End Sub 52 main() 51 53 }}} 52 54 53 ここで、LocalObjには 一旦ヒープ領域に一時確保されたtest関数内objが静的オブジェクトにコピーされる。54 そして、 RefObjのほうは、一回もオブジェクトインスタンスのコピーが発生することなく、test関数内でNewされたObject型オブジェクトを保持している。55 ここで、LocalObjにはglobalObjの実体がコピーされる。 56 そして、refObjのほうは、一回もオブジェクトインスタンスのコピーが発生することなく、globalObjを参照することになる。 55 57 56 58 57 == Refステートメント==59 == ByRef修飾子の活用範囲 == 58 60 59 ABの参照型変数を定義するためのステートメントとしてRefを実装する。Refステートメントは参照型変数を定義可能。基本型をRefで定義できるようにするかは未定。Refステートメントに対し、Dimステートメントで定義されたオブジェクトはスタック領域(グローバルの場合は静的領域)に作成される。 60 61 尚、Refステートメントの書式はDimのものとほぼ同じ。 61 今までは参照型パラメータのみに指定可能だったByRefが関数の戻り値やDimステートメントの修飾子として利用できるようになる。