C#警告中的冗余显式属性名称

时间:2013-10-02 14:01:20

标签: c# resharper

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

要在注册时保存其他字段,请使用在任何地方使用的方法,例如: Link

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

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

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

这样可行。

我的问题是我安装了Jetbrains Resharper 8,对于属性名称,我得到了“冗余显式属性名称”警告。 要删除警告,我更改我的代码将如下所示:

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

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

2)具有或不具有属性名称的最佳实践是什么。没有它们是不可读的,并且在代码示例中它们被指定,所以我认为将它们放入可读性更好而不是删除它

3 个答案:

答案 0 :(得分:10)

  

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

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

  

2)具有或不具有属性名称的最佳实践是什么。没有它们是不是非常易读,并且在代码示例中它们被指定,所以我认为让它们更好而不是删除它

如果您和您的团队始终包含该名称更具可读性,那么请继续这样做。对于其他人来说,可能会感到有点多余。只需调整您的R#设置即可符合您当地的惯例。

你在“在代码示例中指定它们”的论点虽然有点似乎 - 有一些例子指出了它们,有些则指出它们不是。我怀疑你甚至会在特定的示例提供程序中找到混合物(例如在MSDN中)。

答案 1 :(得分:2)

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

当您不需要时,明确说明属性名称是个人偏好;一旦你熟悉上述惯例,我认为它不会损害可读性。

答案 2 :(得分:0)

  •   

    它是如何知道属性名称将用于匹配db属性类的,因为它们是按值传递的

在一个nuthel中,在编译时创建了无数类型。因此编译器使用传递的表达式解析属性名称,并且在结果中我们有一个具有声明的readonly属性的anonimous类。您可以检查IL以查看程序集包含此类型,并且属性设置为明确。

  •   

  • 中使用属性名称的最佳做法是什么   
  这取决于每个人。我建议为您的团队选择一种方式,并在每台DEV机器上使用相同的Resharper设置。