【问题标题】:Redundant explicit property name in C# warningC# 警告中的冗余显式属性名称
【发布时间】:2013-10-08 22:43:36
【问题描述】:

我正在使用 SimpleMembership 提供程序并添加要在注册时保存的其他字段。

为了在注册时保存其他字段,我使用到处使用的方法,例如Seed Users and Roles with MVC 4, SimpleMembershipProvider, SimpleRoleProvider, Entity Framework 5 CodeFirst, and Custom User Properties.

我使用在我的 HttpPost ActionResult Register 方法中调用的以下 SimpleMembership 提供程序方法。

WebSecurity.CreateUserAndAccount(registerModel.UserName, registerModel.Password,
    new { FirstName = registerModel.FirstName, LastName = registerModel.LastName, CompanyName = registerModel.CompanyName});

其他字段由对象类型的按值方法参数添加。对此的描述是“包含附加用户属性的字典”

这可行,但我安装了 JetBrains ReSharper 8,并且对于属性名称,我收到“冗余显式属性名称”警告。

要删除警告,我将代码更改为:

WebSecurity.CreateUserAndAccount(registerModel.UserName, registerModel.Password,
    new { registerModel.FirstName, registerModel.LastName, registerModel.CompanyName}); 

我的问题是:

1) 对于这个匿名对象参数,我现在删除了属性名称,因此我不再收到 Resharper 警告,它如何知道属性名称将用于匹配 db 属性类,因为它们是按值传递?

2) 是否包含属性名称的最佳做法是什么。不包含它们不是很可读,并且在代码示例中指定了它们,所以我想将它们包含在可读性上比删除它更好。

【问题讨论】:

    标签: c# resharper


    【解决方案1】:
    • 它如何知道属性名称将用于匹配 db 属性类,因为它们是按值传递的

    简而言之,匿名类型是在编译时创建的。因此,编译器使用传递的表达式解析属性名称,结果我们有一个匿名类,其中声明了readonly 属性。您可以检查您的 IL 以查看程序集是否包含此类型并且已明确设置属性。

    • 是否包含属性名称的最佳做法是什么

    这取决于每个人。我建议为您的团队选择一种方式,并在每台开发人员机器上使用相同的 ReSharper 设置。

    【讨论】:

      【解决方案2】:

      当您设置 propertyNames 对象时,您正在创建一个匿名类型的实例 - 当您这样做时,如果属性名称与您分配值的属性相同,则可以省略属性名称。这就是 ReSharper 说这些名称是多余的原因。

      不需要时明确说明属性名称是个人喜好;一旦您熟悉了上述约定,我认为它不会损害可读性。

      【讨论】:

        【解决方案3】:

        我的问题是 1) 对于这个匿名对象参数,我现在删除了属性名称,因此我不再收到 Resharper 警告,它如何知道属性名称是什么,因为它们是按值传递的?

        名称是从表达式中推断出来的(由编译器)。这仅在您使用字段或属性(例如,不是文字或方法)时才有效。这在 C# 语言规范的第 7.6.10 节中。

        2) 是否包含属性名称的最佳做法是什么。不包含它们不是很可读,并且在代码示例中指定了它们,因此我认为将它们包含在而不是删除它更好

        如果始终包含名称对您和您的团队来说更易读,那么请继续这样做。对于其他人来说,可能会觉得有点多余。只需调整您的 R# 设置以适应您的当地惯例。

        您关于“在代码示例中指定它们”的论点是似是而非的——有些例子是指定的,有些不是。我怀疑即使在特定的示例提供程序中(例如在 MSDN 中),您也会发现混合。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2021-10-07
          • 1970-01-01
          • 1970-01-01
          • 2021-02-26
          • 1970-01-01
          • 2014-08-26
          • 2021-01-13
          • 2021-07-23
          相关资源
          最近更新 更多