5

C# で変数のスコープを狭めたい場合は、追加の中かっこを導入できます。つまり、次のようになります。

class Program
{
    static void Main(string[] args)
    {
        myClass x = new myClass();
        x.MyProperty = 1000;
        Console.WriteLine("x = " + x.MyProperty);

        {
            myClass y = new myClass();
            y.MyProperty = 2000;
            Console.WriteLine("y = " + y.MyProperty);
        }

        myClass y2 = new myClass();
        y2.MyProperty = 3000;
        Console.WriteLine("y2 = " + y2.MyProperty);

    }

    class myClass
    {

        public int MyProperty { get; set; }

    }
}

IDE では、新しい波括弧によって導入されたスコープ外で y を参照できなくなりました。これは、変数 y がガベージ コレクションに使用できることを意味すると考えていたでしょう。

(興味深いことに、リフレクターを使用してコンパイルされたコードを表示すると、中括弧を追加してもしなくても違いがないように見えます)

VB.net を使用する場合、これに似た範囲を狭める方法はありますか? これは、内部スコープで定義された変数がいつガベージ コレクションされる可能性があるかに影響しますか?

4

4 に答える 4

6

興味深いことに、developerFusion c#-vb.net コード コンバーターは、

 {
    myClass y = new myClass();
    y.MyProperty = 2000;
    Console.WriteLine("y = " + y.MyProperty);
 }

If True Then
   Dim y As New [myClass]()
   y.MyProperty = 2000
   Console.WriteLine("y = " & y.MyProperty)
End If

範囲を限定する方法として。ペイントボールボブの答えを気にするのは驚きです

于 2009-09-28T09:00:11.917 に答える
2

vbで新しいスコープを作成する良い方法はないようですが、1回だけ実行されるループを保証してから、そのループ内で変数を宣言することができます。

MSDN は、変数の有効期間について次のように述べています。

変数のスコープがブロックに限定されている場合でも、その有効期間はプロシージャ全体のものです。手順中にブロックを複数回入力すると、各ブロック変数は以前の値を保持します。このような場合に予期しない結果を回避するには、ブロックの先頭でブロック変数を初期化するのが賢明です。

ソース: http://msdn.microsoft.com/en-us/library/1t0wsc67.aspx

手順が完了すると、変数はガベージ コレクションの対象になるようですが、それでもヒープが混雑しない限り、ガベージ コレクタは実行されません。ほとんどの場合、小さなアプリの場合、アプリが閉じられるまでガベージ コレクションは行われません。

于 2009-09-28T06:09:06.927 に答える
0

少なくとも C# では、デバッガーが接続されていない場合、ガベージ コレクションに違いはありません。変数が最後に読み取られたときに GC が機能し、その後変数は GC ルートとしてカウントされません。点。例えば:

 object y = new object();
 Console.WriteLine("y is still a GC root");
 Console.WriteLine(y);
 Console.WriteLine("y is not a GC root now");
 y = null;
 Console.WriteLine("y is still not a GC root");

(用語的には、変数自体は収集されません。ガベージ コレクターの "ルート" としてカウントされますが、参照しているオブジェクトが収集されるのを防ぎます。)

デバッガーが接続されている場合、最後の「通常の」読み取りポイントの後に変数の値を調べたい場合があるため、GC ははるかに保守的です。

スコーピングを減らすことの主な利点は、IMO の明快さです。変数のスコープが狭い場合、そのコードを見ていないときは忘れることができます (デリゲートなどによってキャプチャされていないと仮定します)。

スコープ以外の理由で、VB にステートメント ブロックに相当するものがあるかどうかはわかりません。最も近い同等のものはWithステートメント...またはDo...Loop While Falseステートメントである可能性があり、どちらも完全に満足できるものではありません。

于 2009-09-28T06:08:53.493 に答える
0

いくつかのメソッドを作成してみませんか? スコープはメソッドで定義する必要があります。メソッドを終了すると、スコープを離れます - クリーンで簡単です。あなたのやり方は非常に非正統的です - スコープクリープ(あなたが説明していること)が心配な場合は、慣習に固執し、メソッドを使用することをお勧めします。

于 2012-04-09T19:32:47.590 に答える