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。那么,为什么这个块没有灰化,说明它是死代码呢?

顺便说一句,FETCH_TAB灰色化/识别为死声明,因为 tabMain.SelectedIndex 从未分配为 0,因此我无处使用它。

4

4 回答 4

6

由于 SetFetchTab 是一个公共字段,而不是变量,因此可以通过外部代码直接从未知库或通过反射更改它。

如果它是方法中的变量,那么任何外部代码都无法更改它,因此 Resharper 可以断定代码已死。

于 2013-04-15T15:43:09.110 回答
4

好吧,public static bool SetFetchTab;由于声明,变量被分配给它的默认值,所以这等于写成

public static bool SetFetchTab = default(bool);

它被使用

if (SetFetchTab)
{
    tabMain.SelectedIndex = CONNECTION_TAB;
}

根据提供的代码,所以这里没有任何问题。

价值永远不会改变的事实,我认为没有人能够确定相关的成功百分比,至少我不知道。考虑到也可以使用反射SetFetchTab任何地方(它是 a )更改值。public static

于 2013-04-15T15:40:36.973 回答
4

R# 玩得很安全。它并不假设作为应用程序一部分的所有程序集都在您的解决方案中。由于它是公共的,另一个程序集(可能是动态加载的程序集)可以将公共字段设置回零。如果你要移除它,你会破坏那个假设的组件。如果您确定它仅在内部使用,请将其设置为内部或私有,并且 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 回答