错误的Resharper建议-未使用的变量(实际上在数据绑定中使用)

本文关键字:数据绑定 实际上 建议 Resharper 未使用 变量 错误 | 更新日期: 2023-09-27 18:10:30

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

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

我不喜欢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;
    }
}

错误的Resharper建议-未使用的变量(实际上在数据绑定中使用)

我认为你有三个选择:

  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;
    }
}

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

我每天都在工作中看到这种情况。当开发者意识到Resharper的存在是为了提供建议,他们可以查看这些建议,然后选择忽略他们的代码是否有意义时,他们却一心只想让Resharper开心,并对那些弯弯曲曲的线条和警告产生了强迫性的反应。

尝试将它们设置为属性

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

ReSharper不能知道某些字段只通过反射使用。

使它们成为如下所示的属性

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]});

我看不出你在类的任何地方使用了ID或Name。在构造函数中赋值不算数,顺便说一句,这可能就是它抱怨的原因。

Resharper建议这个变量是私有的,因为你不会在其他地方使用它。由于您没有定义任何getter或setter,因此可能假定您正在使用这些变量来内部跟踪状态。