不正确的Resharper建议 - 未使用的变量(实际用于数据绑定)

时间:2013-04-23 23:13:31

标签: c# asp.net resharper

我有一段代码,Resharper告诉我有未使用的变量,但绝对使用变量。变量在Databind()中使用,而要绑定的字段指定为字符串。由于字段名称是使用字符串变量访问的,因此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;
    }
}

6 个答案:

答案 0 :(得分:5)

我认为你有3个选择:

  1. 使用匿名课程,因为无论如何你都没有使用强类型。
  2. 通过评论取消警告,并添加解释原因的评论。
  3. 添加ReSharper的[UsedImplicitly]属性,并添加注释解释原因(不确定这个是否适用于字段)。
  4. 选项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;
        }
    }
    

答案 1 :(得分:1)

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

我在工作中看到了这一天。当他们应该意识到Resharper在那里做出建议他们可以审查然后选择忽略他们的代码使得时,开发人员总是倾向于让Resharper感到高兴,并且让OCD超过小波浪线和警告。感。

答案 2 :(得分: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]});

答案 3 :(得分:0)

尝试制作属性

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

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

答案 4 :(得分:0)

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

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

答案 5 :(得分:0)

我没有在课堂的任何地方看到你在哪里使用ID或Name。在构造函数中分配它不计算,顺便说一下这可能是它抱怨的原因。

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