4

我有一段代码,Resharper 告诉我有未使用的变量,但这些变量肯定是使用的。变量在 Databind() 中使用,要绑定的字段被指定为字符串。由于使用字符串变量访问字段名称,Resharper 认为它们没有被使用。

在下面的代码示例中,Resharper 告诉我将公共变量更改为私有。这样做之后,它告诉我该变量未使用并且可以删除。这两个建议都是错误的,因为使用了变量并且必须是公共的。

我不喜欢 Resharper 警告我这个并且是黄色的。我想检查我的绿色代码。我知道我可以使用取消注释的选项来忽略这一点,但过去我从来没有使用过这个选项,并且能够找到其他解决方案来让我的代码变绿。在这种情况下,我无法找到另一种方法。有谁知道我怎样才能让 Resharper 识别出这个变量正在被使用?

using System;
using System.Collections;
using System.Web.UI.WebControls;

public partial class TestCode_General_ResharperTest : System.Web.UI.Page
{
    private class TestClass
    {
        public TestClass(string name, string id)
        {
            ID = id;
            Name = name;
        }

        public string ID;  /*Resharper says this can be made private*/
        public string Name; /*Resharper says this can be made private*/
    }

    protected void Page_Load(object sender, EventArgs e)
    {
        if (!Page.IsPostBack)
        {
            DropDownList testList = new DropDownList();
            ArrayList groups = getTestList();
            testList.DataSource = groups;
            testList.DataValueField = "ID";
            testList.DataTextField = "Name";
            testList.DataBind();    /* Databind causes the public variables to be accessed.*/
        }
    }

    private static ArrayList getTestList()
    {
        ArrayList groupInfo = new ArrayList();
        string[] pairs = new[] { "Test:1", "Test 2:2", "Test 3:3" };
        foreach (string pair in pairs)
        {
            string[] values = pair.Split(new[] { ':' });
            groupInfo.Add(new TestClass(values[0], values[1]));
        }
        return groupInfo;
    }
}
4

6 回答 6

5

我认为你有3个选择:

  1. 使用匿名类,因为无论如何您都没有在这里使用强类型。
  2. 用评论禁止警告,并添加评论解释原因。
  3. 添加 ReSharper 的[UsedImplicitly]属性,并添加解释原因的注释(虽然不确定这是否适用于字段)。

选项 1 的示例:

using System;
using System.Collections;
using System.Web.UI.WebControls;

public partial class TestCode_General_ResharperTest : System.Web.UI.Page
{
    protected override void OnLoad(EventArgs e)
    {
        base.OnLoad(e);
        if (Page.IsPostBack)
            return;

        var testList = new DropDownList();
        testList.DataSource = GetTestListData();
        testList.DataValueField = "ID";
        testList.DataTextField = "Name";
        testList.DataBind();    /* Databind causes the public variables to be accessed.*/
    }

    private static IEnumerable<object> GetTestListData()
    {
        var groups = new List<object>();
        var pairs = new[] { "Test:1", "Test 2:2", "Test 3:3" };
        foreach (var pair in pairs)
        {
            var values = pair.Split(new[] { ':' });
            groups.Add(new { ID = values[0], Name = values[1] });
        }
        return groups;
    }
}
于 2013-04-24T01:02:53.457 回答
1

Resharper 无法知道 DropDownList 上的 DataBind 方法需要访问这些字段/属性。如果要删除警告,可以将它们设为属性,然后像其他人提到的那样创建您的 TestClass,或者您可以使用注释来抑制它们。

我每天都在工作中看到这一点。当开发人员应该意识到 Resharper 的存在是为了提出他们可以审查的建议,然后在他们的代码有意义时选择忽略时,他们会下定决心让 Resharper 开心,并让 OCD 克服那些弯曲的小线条和警告。

于 2013-04-23T23:46:44.533 回答
0

使它们的属性如下所示

private class TestClass
    {
        public TestClass()
        {

        }

        public string ID{get;set;}
        public string Name{get;set;}
    }

并像使用它一样

 groupInfo.Add(new TestClass{ID=values[0], Name= values[1]});
于 2013-04-23T23:20:41.993 回答
0

尝试使它们成为属性

private class TestClass
{
    public TestClass(string name, string id)
    {
        ID = id;
        Name = name;
    }

    public string ID { get; set; }
    public string Name { get; set; }
}
于 2013-04-23T23:22:05.417 回答
0

ReSharper 无法知道某些字段仅通过反射使用。

考虑将它们设为属性而不是公共字段。

于 2013-04-23T23:22:42.017 回答
0

我看不到您在课堂上的任何地方使用 ID 或 Name。在构造函数中分配它不算数,顺便说一句,这可能就是它抱怨的原因。

Resharper 建议将变量设为私有变量,因为您不会在其他任何地方使用它,因此出于谨慎考虑;由于您没有定义任何 getter 或 setter,因此可能假设您正在使用这些变量在内部跟踪状态。

于 2013-04-24T03:01:48.630 回答