3

ブロック内のクラスなど、ユーザー定義型を使用できますか? 私が使用したとき:

  1. IDisposable を継承し、Dispose メソッドを実装する必要があるとのことでした。Dispose メソッドを継承して定義しようとしましたが、できませんでした。それは私に公開されていないか何かを示しています:(どうすればそれを達成できるかについての小さなコードでこれを理解するのを手伝ってください。

  2. 「using」ブラケット内にクラスのインスタンスを作成すると、この変数のスコープはその using ブロック内のみですが、同じクラスの別のインスタンスを using の外で同じ変数で作成できないのはなぜですか? その正当な理由はわかりません:(私の推論は正しいですか?しかし、同じ変数を使用して別のクラスを別のクラスをインスタンス化するために使用できます(コンパイルエラーが表示されないため)。コーディングガイドラインを実践する必要があります(ただし、概念的にはロジックを求めています)....

助けてください、私はC#が初めてです

4

1 に答える 1

8

ステートメントの要点は、インターフェイスで指定されたメソッドusingを呼び出すことです。DisposeIDisposable

はい、インターフェイスを実装するときは、メソッドをパブリックにするか、明示的なインターフェイス実装を使用する必要があります。

// Via a public method
public class Foo : IDisposable
{
    public void Dispose()
    {
        // Stuff
    }
}

// Via explicit interface implementation
public class Bar : IDisposable
{
    void IDisposable.Dispose()
    {
        // Stuff
    }
}

ここには特に何もありませんIDisposable。通常のインターフェイスの実装です。

ただし、それのためだけに実装するべきではありません-アイデアは、クリーンアップする必要があるということです-実行するクリーンアップがない場合は、ステートメントもIDisposable必要ありません。using

2 番目の点については、まだスコープ内にある別のローカル変数と同じ名前のローカル変数を宣言することは許可されていません。読むと非常に混乱するため、禁止されています。C# 仕様のセクション 8.5.1 から:

local-variable-declaration で宣言されたローカル変数のスコープは、宣言が発生するブロックです。ローカル変数の local-variable-declarator より前のテキスト位置でローカル変数を参照すると、エラーになります。ローカル変数のスコープ内で、同じ名前の別のローカル変数または定数を宣言すると、コンパイル時エラーになります。

両方が同時にスコープ内にない限り、1 つのメソッドで同じローカル変数名を 2 回使用できることに注意してください。

void M()
{
    using (Stream x = ...)
    {
    }

    using (Stream x = ...)
    {
    }

    for (int x = 0; x < 10; x++)
    {
    }

    // Block introduced just for scoping...
    {
        string x = "";
        ...
    }
}
于 2012-07-21T17:02:39.057 に答える