2

今週の最初の編集に向かう途中で、面白いことが起こりました。このコード行に出くわしました:

if (SetFetchTab)
    tabMain.SelectedIndex = 1;

...そして、まあ、それを const にして読みやすくし、後でこの条件に追加のコードを追加する必要がある場合に備えて、中括弧で囲みます。

const int FETCH_TAB = 0;
const int CONNECTION_TAB = 1;
. . .
if (SetFetchTab)
{
    tabMain.SelectedIndex = CONNECTION_TAB;
}

しかし、好奇心に負けて、SetFetchTab に値が割り当てられている場所を見つけることにしました...そうではありません-宣言されている場所に暗黙的に割り当てられた false/0 を除いて:

public static bool SetFetchTab;

ある時点で、別のフォームが条件付きで SetFetchTab を 0 または 1 に設定していましたが、そのコードは現在コメント アウトされています。したがって、上記の条件が真になることは決してなく、SelectedIndex には CONNECTION_TAB/1 が割り当てられることはありません。では、なぜこのブロックがグレイ表示されず、デッド コードであることを示しているのでしょうか?

ところで、tabMain.SelectedIndexには0 が割り当てられないため、FETCH_TAB は灰色化され、無効な宣言として認識されます。したがって、これを使用する場所がありませんでした。

4

4 に答える 4

6

SetFetchTab はパブリック フィールドであり、変数ではないため、未知のライブラリから直接、またはリフレクションを介して、外部コードによって変更できます。

メソッド内の変数である場合、外部コードによって変更することはできないため、Resharper はコードが無効であると結論付けることができます。

于 2013-04-15T15:43:09.110 に答える
4

R# は安全にプレイしています。アプリケーションの一部であるすべてのアセンブリがソリューションに含まれているとは限りません。public であるため、別のアセンブリ (おそらく動的に読み込まれるアセンブリ) が public フィールドを 0 に戻す可能性があります。それを削除すると、その仮想アセンブリが壊れてしまいます。内部でのみ使用されていることが確実な場合は、内部またはプライベートに設定すると、R# は使用されていないことを検出する必要があります。

于 2013-04-15T15:48:31.403 に答える
0

ああ、Resharper はまたしても私より賢いことがわかりました (それが私が大金を払っている理由です)。私はこのコードを見つけました:

if (!saveThisUser_Validate(ref txtSiteNbr, 0)) return false;
if (!saveThisUser_Validate(ref txtIP, 1)) return false;

private bool saveThisUser_Validate(ref TextBox tb, int index)
{
    if (tb.Text != "")
        return true;
    MessageBox.Show("Not all required fields have been filled in", CCR.GetFormTitle("", "", ""));
    tb.Focus();
    tabMain.SelectedIndex = index;
    return false;
}

...そして次のように変更しました:

if (!saveThisUser_Validate(ref txtSiteNbr, FETCH_TAB)) return false;
if (!saveThisUser_Validate(ref txtIP, CONNECTION_TAB)) return false;
于 2013-04-15T15:55:54.230 に答える