Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Redundant explicit property name in C# warning

Tags:

c#

resharper

I am using the SimpleMembership provider and adding additional fields to be saved on registration.

To save additional fields on registration I use the method used everywhere e.g. Seed Users and Roles with MVC 4, SimpleMembershipProvider, SimpleRoleProvider, Entity Framework 5 CodeFirst, and Custom User Properties.

I use the following SimpleMembership provider method called in my HttpPost ActionResult Register method.

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

Additional fields get added by a by value method parameter of type object. The description for this is "A dictionary that contains additional user attributes"

This works, but I have JetBrains ReSharper 8 installed and for the property names I get "redundant explicit property name" warnings.

To remove the warnings I changed my code to:

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

My questions are:

1) for this anonymous object parameter where I now remove the property names so I don't get the Resharper warnings anymore, how does it know what the property names will be use to match to the db property class, since they are passed by value?

2) what is best practice having the property names in or not. Having them not in is not very readable and in code samples they are specified, so I would imagine having them in is better for readability rather than removing it.

like image 989
greay Avatar asked Oct 02 '13 14:10

greay


3 Answers

My question are 1) for this anonymous object parameter where I now remove the property names so I don't get the Resharper warnings anymore, how does it know what the property names are since they are passed by value?

The names are inferred (by the compiler) from the expressions. This only works when you're using a field or property (not a literal or a method for example). This is in section 7.6.10 of the C# language specification.

2) what is best practice having the property names in or not. Having them not in is not very readable and in code samples they are specified so I would imagine having them in is better rather than removing it

If it's more readable for you and your team to always include the name, then go ahead and do so. For other people, it may feel a little redundant. Just adjust your R# settings to fit your local conventions.

Your argument that "in code samples they are specified" is specious though - there are some examples where they're specified and some where they're not. I suspect you'll find a mixture even within particular example providers (e.g. in MSDN).

like image 109
Jon Skeet Avatar answered Oct 23 '22 21:10

Jon Skeet


When you set up your propertyNames object you're creating an instance of an anonymous Type - when you do that you can leave out the property name if it's the same as the property from which you're assigning the value. That's why ReSharper says the names are redundant.

Explicitly stating property names when you don't have to is personal preference; once you're familiar with the above convention I don't think it harms readability.

like image 38
Steve Wilkes Avatar answered Oct 23 '22 23:10

Steve Wilkes


  • how does it know what the property names will be use to match to the db property class since they are passed by value

In a nutshell anonymous types are created on compile time. So the compiler resolves property names using expressions passed and in the result we have an anonymous class with declared readonly properties. You can check your IL in order to see that the assembly contains this type and properties are set explicitly.

  • what is best practice having the property names in or not

It depends on each person. I would recommend to choose a single way for your team and use the same ReSharper settings on each developer machine.

like image 33
Egor4eg Avatar answered Oct 23 '22 22:10

Egor4eg