web-dev-qa-db-ja.com

C#到達不能コードが検出されました

以下のコードのi ++の時点で、VisualStudioに「到達不能コードが検出されました」というメッセージが表示されます。私が間違ったことを見つけられますか?

try
{
    RegistryKey OurKey = Registry.CurrentUser;
    OurKey.CreateSubKey("Software\\Resources\\Shared");
    OurKey = OurKey.OpenSubKey("Software\\Resources\\Shared", true);
    for (int i = 0; i < cmbPaths.Items.Count; i++) //<---- problem with i
    {
        OurKey.SetValue("paths" + i, cmbPaths.Items[i]);
        break;
    }
}
10
Jamie

問題は、これが実際にはループではないということです。休憩の条件がないので、同等に次のようなものを書くことができます

if(cmbPath.Items.Count > 0)
{
   OurKey.SetValue("paths" + 0, cmbPaths.Items[0]);
}

または、次のような修正が必要です

for (int i = 0; i < cmbPaths.Items.Count; i++) 
{
   OurKey.SetValue("paths" + i, cmbPaths.Items[i]);

   if(someConditionHolds)
      break;
}
24
Juri

最初の反復が終了する前に、ループから抜け出します。

11
wefwfwefwe

問題はあなたがbreak;ループ内で、他に何もする可能性がない場合、iの増分(i++)到達することはありません。

3
Daniel Elliott

たとえば、Entity Frameworkを使用していて、そのプロジェクトへの参照を追加しなかった場合、到達不能コードが発生する可能性もあります。

データレイヤープロジェクト、ドメインクラスなどのプロジェクトがいくつかあるとします。次に、テスト用のコンソールアプリなどを作成し、dbcontextの場所を参照しますが、たとえばnugetを使用せずにEFを追加すると、次のようになります。ループなどを書き込もうとすると、コードに到達できなくなります。

0
Tom Stickel

あなたの問題は解決されましたが、私はあなたにこれを伝える必要があります、あなたはあなたの目的のためにCreateSubKey()メソッドを使うことができます。私はそれがより良い選択だと思います。 :)

//Creates a new subkey or opens an existing subkey for write access.
var ourKey = Registry.CurrentUser.CreateSubKey("Software\\Resources\\Shared");
0
NET3