5

以下の例では、返送されたものはpen破棄(廃棄)されますか?

' VB'
Public Function GetPen() As System.Drawing.Pen
  Using pen As New System.Drawing.Pen(_Color, _Width)
    pen.DashStyle = _DashStyle
    Return pen
  End Using
End Function

// C#
public System.Drawing.Pen GetPen()
{
    using (System.Drawing.Pen pen = new System.Drawing.Pen(_Color, _Width)) 
    {
        pen.DashStyle = _DashStyle;
        return pen;
    }
}

[編集]

もう1つの精度...Penオブジェクトは、参照によってGetPenの呼び出し元に送信されますか、それとも構造体のように「複製」されますか?これはクラスですが、GDIオブジェクトではわかりません...

外部メソッドが取得したものを破棄するときにpen作成されたものを破棄(破棄)しますか?GetPen()penGetPen()

4

11 に答える 11

7

はい、処分されます。その後、廃棄された状態で返送するため、何の役にも立ちません。このようなファクトリメソッドを使用してインスタンスを返す場合は、このようなメソッド内のブロックPenを使用するのではなく、メソッドの外部でインスタンスを破棄する必要があります。using

于 2010-01-13T14:50:40.867 に答える
6

ペンは必ずしもガベージコレクションされるとは限りませんが、Dispose()メソッドが呼び出されます。

于 2010-01-13T14:50:54.360 に答える
3

はい、ペンは処分されます。しかし、それは本当に悪い考えです。すでに処分されたペンを返却します!

実行したいのは、GetPenからUsingステートメントを削除することです。Usingステートメントは、GetPenの呼び出し元が使用する必要があります。

Using pen As Pen = GetPen()
    ''// Draw with this pen
End Using

またはC#の場合:

using(Pen pen = GetPen())
{
    // Draw with this pen
}

[編集]

はい、参照はコピーではなく、呼び出し元のメソッドに返されます。そのため、GetPenでペンを破棄すると、呼び出し元のメソッドでそのペンを使用できなくなります;-)

GetPenと呼び出し元のメソッドが同じPenオブジェクトを指しているため、呼び出し元のメソッドでDisposeを呼び出す必要があります。

于 2010-01-13T14:51:00.400 に答える
3

ペンは返却前に廃棄されます。その同等物

public System.Drawing.Pen GetPen()
{
    try
    {
      System.Drawing.Pen pen = new System.Drawing.Pen(_Color, _Width);

      pen.DashStyle = _DashStyle;
    }
    finally
    {
      pen.Dispose();
    }
    return pen;

}
于 2010-01-13T14:52:17.993 に答える
1

はい、処分されます。

于 2010-01-13T14:51:00.930 に答える
1

返品が完了すると自動的に廃棄されます。使用すると、Dispose()が暗黙的に使用されます。

于 2010-01-13T14:51:52.003 に答える
1

はい。

返されたPenオブジェクトは、呼び出し元が受け取る前に破棄されます。

スタイルメソッドではGet()、オブジェクトの破棄を処理する必要はありません。呼び出し元がオブジェクトを処理した後、オブジェクトを破棄できるようにます。呼び出し元の関数は次のようになると思います。

using(Pen myPen = GetPen())
{
    // My code here.
}
于 2010-01-13T14:53:08.540 に答える
1

オブジェクトを返すため、コードの構造を変える必要があります。オブジェクトはすぐに破棄されます。

public System.Drawing.Pen GetPen() 
{ 
    System.Drawing.Pen pen = new System.Drawing.Pen(_Color, _Width)
    { 
        DashStyle = _DashStyle; 
    } 
    return pen; 
} 

次に、次を使用して呼び出します。

using (System.Drawing.Pen pen = GetPen())
{
    //Do stuff with your pen...
}
于 2010-01-13T14:57:48.297 に答える
0

返品Penが完了する前にオブジェクトが破棄され、ペンオブジェクトが無効な状態のままになります。

于 2010-01-13T14:53:08.507 に答える
0

はい。コードのC#バージョンとVB.netバージョンの両方で、関数が戻る前に.Dispose()メソッドが呼び出されます。これは、オブジェクトを破棄することと同じではありませんが(オブジェクトはまだ存在します)、オブジェクトを面白くて便利なものにしたアンマネージリソースが解放されるため、すべての実用的な目的でオブジェクトは役に立ちません。

関数内にIDisposableリソースを構築するときに使用する正しいパターンは、それを返すだけで、次のようにusing宣言を使用して関数を呼び出すことです。

public System.Drawing.Pen GetPen()
{
    var pen = new System.Drawing.Pen(_Color, _Width)) 
    pen.DashStyle = _DashStyle;
    return pen;
}

public void FunctionThatCallsGetPen()
{
    using (System.Drawing.Pen pen = GetPen())
    {
       //use pen here
    }
}
于 2010-01-13T14:54:36.350 に答える
0

using isは、おおよそ次のステートメントと同じです。

試す {

     var something = new something() ;

}

ついに {

 if (something != null)
 { something.Dispose();}   

}

于 2010-01-13T14:56:32.540 に答える