1. ホーム
  2. c#

IDE0063はいつ廃棄されるのですか?

2023-09-07 22:56:38

質問

このC# 8の簡略化機能を理解しようとしているのですが。

IDE0063 'using'ステートメントを簡略化することができます。

例えば、私が持っている

void Method()
{
    using (var client = new Client())
    {
        // pre code...
        client.Do();
        // post code...
    } --> client.Dispose() was called here.
    // more code...
}

IDE は、これを単純化することができると教えてくれました。 using ステートメントを簡略化することができると教えてくれました。

void Method()
{
    using (var client = new Client());
    // pre code...
    client.Do();
    // post code...
    // more code...
}

私は、それがどのように機能し、どのように私を決定するのか理解できません。 using 変数でないと判断する方法がわかりません。具体的には、いつ client.Dispose メソッドを呼び出すのでしょうか?

どのように解決するのですか?

C#8を使用しています。古いバージョンのC#では ; を使用すると、これは無効になってしまいます。

新しい構文では client は周囲のメソッド (または他の {} のスコープブロック) に留まります。の外側のペアを省略することができることに注意してください。 () も省略できます。

と呼ばれるもので、これは 使用宣言 で、ドキュメントは ここで .

void Method()
{
    using var client = new Client();
    // pre code...
    client.Do();
    // post code...
    // more code...
} --> client.Dispose() is called here (at the latest)

論理的には、Dispose は } で行われますが、オプティマイザはそれよりも前にそれを行うかもしれません。

編集

私は // more code の後に using というブロックの末尾に記述することで、この改善が現れるのを防ぐことができます。ですから、次のようなコードに変換すれば、曖昧さはなくなります。

void Method()
{
    // not relevant code

    using (var client = new Client())
    {
        // pre code...
        client.Do();
        // post code...
    }
}

をこのコードに置き換える。

void Method()
{
    // not relevant code

    using var client = new Client();
    // pre code...
    client.Do();
    // post code...
}