19

Windows の VS2010、VS2008、または MonoDevelop で次のプログラムをコンパイルすると、「変数 'y' が割り当てられていますが、その値が使用されていません」という警告CS0219が表示されます。

namespace Problem
{
    public class Program
    {        
        private static void Main(string[] args)
        {
            object x = new object();
            int y = 0;
        }
    }
}

xVisual Studio でのコンパイル時に警告が表示されないのはなぜですか?

興味深いことに、 Mac OS X の MonoDevelop でコンパイルするx 、 CS0219 警告が表示されます。y

4

7 に答える 7

26

代入演算の右側がコンパイル時の定数でない場合、この警告は抑制されることがわかります。

Microsoft の Visual Studio フィードバック サイトから削除された投稿では、デバッグ中にメソッド呼び出しが返す内容を純粋に確認できるように変数を代入していた人々から多くの苦情があり、警告が苛立たしいものであると説明されていました。

この場合の「割り当て済みだが使用されていない」警告の抑制は、これを行うユーザーからのフィードバックによって動機付けられました。

int Blah(){
    // blah
    BlahBlah(x, y, z)
    // blah
    // blah
}

「ねえ」とデバッグ中にユーザーは言います。しかし、デバッガーで戻り値を調べる簡単な方法はないため、ユーザーは非常に頻繁にこれを行います。

int Blah()
{
    // blah
    int temp = BlahBlah(x, y, z)
    // blah
    // blah
}

次に、ローカルまたはウォッチ ウィンドウを使用して温度を調べます。temp は関数内の他の場所では決して使用されないため、「割り当てられていますが読み取られていません」という苛立たしい警告が生成されました。

以下の理由から、これは少し残念だと思います。

  1. MonoDevelop でこれらの警告が表示されると、実際に役立つと思います。
  2. 誰でも自分で警告を抑制することができます (確かに、未使用のコンパイル時の定数割り当てに対する警告も抑制されます。おそらく、そのための別の警告が必要ですか?)。

とにかく、すべての人を喜ばせることができないことは理解しています。

于 2012-05-17T02:10:40.323 に答える
1

ReSharper は、x が未使用であることも警告します。

于 2012-05-15T04:12:55.103 に答える
0

は参照型であるため、ヒープに格納されているため、スコープ外にxなるまでそのオブジェクトのガベージ コレクションが妨げられる可能性があります。x

例えば:

void main(string[] args)
{
    object x = new object();
    while (true)
    {
        // Some threading stuff
        // x is never garbage collected
    }
}

対照的に:

void main(string[] args)
{
    new object();
    while (true)
    {
        // Some threading stuff
        // The unreferenced object IS garbage collected
    }
}
于 2012-05-15T04:38:01.900 に答える