C# 错误的Resharper建议-未使用的变量(实际用于数据绑定)

C# 错误的Resharper建议-未使用的变量(实际用于数据绑定),c#,asp.net,resharper,C#,Asp.net,Resharper,我有一段代码,Resharper告诉我有未使用的变量,但这些变量肯定被使用了。变量在Databind()中使用,要绑定的字段指定为字符串。因为字段名是使用字符串变量访问的,所以Resharper认为它们没有被使用 在下面的代码示例中,Resharper告诉我将public变量更改为private。这样做之后,它告诉我变量未使用,可以删除。这两个建议都是错误的,因为使用的变量必须是公共的。 我不喜欢那个再竖琴警告我这件事,它是黄色的。我想签入我的绿色代码。我知道我可以通过使用注释抑制选项来忽略这一

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

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

我不喜欢那个再竖琴警告我这件事,它是黄色的。我想签入我的绿色代码。我知道我可以通过使用注释抑制选项来忽略这一点,但在过去,我从未使用过该选项,并且能够找到其他解决方案使代码变绿。在这种情况下,我无法找到另一种方法。有人知道我如何让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;
    }
}

使其具有如下所示的属性

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

试着把它们变成属性

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

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

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


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

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


我每天都在工作中看到这一点。开发人员一心想让Resharper开心,并在他们应该意识到Resharper是在那里提出建议的时候,通过那些细小的扭曲的线条和警告来获得强迫症。如果他们的代码有意义,他们可以查看这些建议,然后选择忽略这些建议。

我认为你有3个选择:

  • 使用一个匿名类,因为您在这里没有使用强类型
  • 抑制带有注释的警告,并添加解释原因的注释
  • 添加ReSharper的
    [usedimplicity]
    属性,并添加解释原因的注释(但不确定此注释是否适用于字段)
  • 选项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;
        }
    }
    
    使用系统;
    使用系统集合;
    使用System.Web.UI.WebControl;
    公共部分类测试代码\u常规\u ResharperTest:System.Web.UI.Page
    {
    受保护的覆盖无效加载(事件参数e)
    {
    基础荷载(e);
    如果(第IsPostBack页)
    返回;
    var testList=new DropDownList();
    testList.DataSource=GetTestListData();
    testList.DataValueField=“ID”;
    testList.DataTextField=“Name”;
    testList.DataBind();/*DataBind导致访问公共变量*/
    }
    私有静态IEnumerable GetTestListData()
    {
    变量组=新列表();
    变量对=新[]{“测试:1”、“测试2:2”、“测试3:3”};
    foreach(成对变量对)
    {
    var值=pair.Split(新[]{':'});
    Add(新的{ID=values[0],Name=values[1]});
    }
    返回组;
    }
    }
    
    我看不出您在类中的任何位置使用ID或名称。在构造函数中分配它并不重要,顺便说一句,这可能就是它抱怨的原因


    Resharper建议变量是私有的,因为您不在其他任何地方使用它,这是一种错误的谨慎做法;由于您没有定义任何getter或setter,因此可能假设您正在使用这些变量在内部跟踪状态。

    我的代码一开始看起来与此完全相同,但出于示例的目的,我对其进行了简化。当我这样做的时候,重奏者告诉我,得到;不使用访问器,并且可以将公共字符串设为私有。这是一个非常好的建议,因为它强制Resharper查看变量是否已分配。它仍然抱怨get;即使在Databind()中使用了访问器,也未使用它。这让我很接近,但不是那个绿色盒子。那你为什么关心Resharper呢?如果你想的话,告诉再竖琴的人。但你所做的并没有错。我的意思是你不是想让resharper开心。Resharper也会做其他的事情,比如将循环更改为foreach,当您更改它时,它会要求您将其更改回foreach。别担心,我就是这样想的,丹。如果我知道代码没有问题,我无法解释为什么我关心它。绿色只是因为一些愚蠢的原因让我高兴。你有点疯狂。我需要在这个问题上冷静一会儿。我建议使用
    List
    而不是不推荐的
    ArrayList
    类。这样,ReSharper至少可以知道你想做什么。我在问题中提到了评论选项,可能不得不把它作为我的最后选择。我修改了我的代码以使用该列表,它对Resharper警告没有任何影响。事实上,将其设置为属性也没有帮助。ReSharper根本不知道通过反射访问的东西。我很确定它也不理解数据绑定表达式。我的第二个[UsedImplicitly]建议我的意见是,在这种情况下,匿名类型是最好的,也是最不冗长的-无论如何,它只能通过反射读取
    ArrayList
    也给出了一个提示(可能是
    List
    )-项目永远不会被降级。干得好,Andrey。匿名类型使我能够摆脱Resharper建议和额外代码。这是一个很好的解决方案。谢谢