Changes between Version 1 and Version 2 of 参照型変数実装へ向けて


Ignore:
Timestamp:
Jan 28, 2007, 3:47:00 AM (17 years ago)
Author:
dai
Comment:

--

Legend:

Unmodified
Added
Removed
Modified
  • 参照型変数実装へ向けて

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