【问题标题】:Incorrect Resharper Suggestion - Unused Variable (Actually Used in Data Binding)不正确的 Resharper 建议 - 未使用的变量(实际用于数据绑定)
【发布时间】:2013-04-17 08:06:48
【问题描述】:

我有一段代码,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;
    }
}

【问题讨论】:

  • 我建议使用 List<TestClass> 而不是已弃用的 ArrayList 类。这样一来,ReSharper 至少会知道您要做什么。
  • 我在问题中提到了评论选项,可能不得不将其作为我的最后选择。我修改了我的代码以使用 List 并且它对 Resharper 警告没有影响。

标签: c# asp.net resharper


【解决方案1】:

我认为你有 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;
    }
}

【讨论】:

  • 我第二个 [UsedImplicitly] 建议
  • 我的观点是匿名类型在这种情况下是最好的并且最不冗长——无论如何它只能通过反射来读取。 ArrayList 也给出了提示(可能是 List&lt;object&gt;)——项目永远不会被淘汰。
  • 干得好安德烈。匿名类型让我摆脱了 Resharper 的建议和额外的代码。这是一个很好的解决方案。谢谢。
【解决方案2】:

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

我在工作中日复一日地看到这一点。当开发人员应该意识到 Resharper 可以提出建议,他们可以查看这些建议,然后如果他们的代码使他们选择忽略感觉。

【讨论】:

    【解决方案3】:

    尝试将它们设为属性

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

    【讨论】:

    • 我的代码一开始看起来就像这样,但为了示例的目的我对其进行了简化。当我这样做时,Resharper 告诉我得到;没有使用访问器,并且可以将公共字符串设为私有。
    【解决方案4】:

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

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

    【讨论】:

    • 事实上,使它们成为属性并没有帮助。 ReSharper 根本不知道通过反射访问的东西。我很确定它也不理解数据绑定表达式。
    【解决方案5】:

    将它们设为如下所示的属性

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

    【讨论】:

    • 这是一个非常好的建议,因为它强制 Resharper 看到变量已分配。它仍然抱怨得到;即使在 Databind() 中使用了访问器,也没有使用它。所以这让我非常接近,但不是那个绿色框。
    • 那么你为什么关心 Resharper?如果您愿意,请告诉 reshaper 家伙。但你所做的并没有错。 :)。我的意思是你不是想让resharper开心。 Resharper 也做其他废话,例如将 for 循环更改为 foreach ,当您更改它时,它会要求您将其更改回 for 。别担心人
    • 我喜欢丹的这个想法。如果我知道代码没问题,我无法解释为什么我会关心它。格林只是出于某种愚蠢的原因让我高兴。你已经有点疯狂了。我需要继续炖一会儿。
    【解决方案6】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-11-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-09
      • 1970-01-01
      相关资源
      最近更新 更多