5

IDisposable を実装するクラスをインスタンス化するときはいつでも、using適切に破棄されるようにキーワードを使用する必要があることを理解しています。

そのようです:

using (SecureString s = new SecureString())
{

}

上記は私にとって理解しやすいです。sこれらの括弧内では好きなように使用できますが、これらの括弧を離れると、 を参照できなくなりますs。スコープが見やすい。

しかし、私が理解していないのはusing、括弧なしで使用した場合の動作です。

private void Function()
{
    // Some code here

    using (SecureString s = new SecureString())

    // more code here
}

角かっこを使用する必要はまったくありません...つまり、usingキーワードに角かっこがない場合、オブジェクトを使用できる場所と破棄される場所をどのように知ることができますか?

4

12 に答える 12

6

using中括弧のないAusingは、次のステートメントのみのスコープ内にあることを意味します- 条件が機能するのと同じ方法ifです。

using (SecureString s = new SecureString())
    s.Foo(); // Works
s.Foo(); // out of scope

個人的な好みとして、このような混乱を避けるために、単一のステートメントif/構文であっても、常に中かっこを含めます。using

于 2013-10-17T14:23:52.033 に答える
3

次に、using ステートメントの後の次のコマンドでのみ有効です。

次の行という意味ではないことに注意してください。次のコマンドのみ。

于 2013-10-17T14:22:10.293 に答える
2

usingif、 などのステートメントforeachでは、角かっこを含めない場合、スコープは単純に次のステートメント (通常は次の行) になります。次のステートメントの周りに括弧を含めたのと同じように扱われます。例えば

if (someCondition)
    Console.WriteLine("someCondition is true!");
Console.WriteLine("I run regardless");
// same as
if (someCondition)
{
    Console.WriteLine("someCondition is true!");
}

using (var s = new SecureString())
    Console.WriteLine(s); // this works!
//Console.WriteLine(s); // s is no longer in scope, this won't compile
于 2013-10-17T14:23:47.567 に答える
2

誰もがこれに答えたので、本質的にこれと同等のインライン using ステートメントを持つことができます:

using(var s = new SecureString()) s.Whatever();

ただし、私の意見では、コードが読みにくくなり、他の開発者を混乱させるため、これを行わないでください。あなたがこの質問をしたという事実によって、この点はよくできていると思います。

于 2013-10-17T14:27:41.193 に答える
1

括弧を使用しない場合は、次のステートメントのみが有効です

using (SecureString s = new SecureString())
    // statement here

複数のステートメントを含める場合は、括弧を使用します。

于 2013-10-17T14:23:53.667 に答える
1

括弧がない場合は、1 行だけになります。「if」または「for」ステートメントと同じです。例えば:

for (int i = 0; i < 10; i++)
    Console.WriteLine(i.ToString());

if (str == "hello")
    Console.WriteLine("hello back!");

using (SecureString s = new SecureString())
    Console.WriteLine("Here we have s");

Console.WriteLine("but here it's out of scope already");
于 2013-10-17T14:24:18.360 に答える