I realize that it seems to be a duplicate of What is the difference between a Field and a Property in C#? but my question has a slight difference (from my point of view):
Once I know that
- I will not use my class with "techniques that only works on properties" and
- I will not use validation code in the getter/setter.
Is there any difference (except the style/future development ones), like some type of control in setting the property?
Is there any additional difference between:
public string MyString { get; set; }
and
public string myString;
(I am aware that, that the first version requires C# 3.0 or above and that the compiler does create the private fields.)
There is one other important difference between fields and properties.
When using WPF, you can only bind to public properties. Binding to a public field will not work. This is true even when not implementing
INotifyPropertyChanged
(even though you always should).The first one:
is a property; the second one (
public string MyString
) denotes a field.The difference is, that certain techniques (ASP.NET databinding for instances), only works on properties, and not on fields. The same is true for XML Serialization: only properties are serialized, fields are not serialized.
Fields and properties look the same, but they are not. Properties are methods and as such there are certain things that are not supported for properties, and some things that may happen with properties but never in the case of fields.
Here's a list of differences:
out/ref
arguments. Properties can not.DateTime.Now
is not always equal to itself.readonly
)MemberTypes
so they are located differently (GetFields
vsGetProperties
for example)Encapsulation.
In the second instance you've just defined a variable, in the first, there is a getter / setter around the variable. So if you decide you want to validate the variable at a later date - it will be a lot easier.
Plus they show up differently in Intellisense :)
Edit: Update for OPs updated question - if you want to ignore the other suggestions here, the other reason is that it's simply not good OO design. And if you don't have a very good reason for doing it, always choose a property over a public variable / field.
Accessors are more than fields. Others have already pointed out several important differences, and I'm going to add one more.
Properties take part in interface classes. For example:
This interface can be satisfied in several ways. For example:
In this implementation we are protecting both the
Person
class from getting into an invalid state, as well as the caller from getting null out from the unassigned property.But we could push the design even further. For example, interface might not deal with the setter. It is quite legitimate to say that consumers of
IPerson
interface are only interested in getting the property, not in setting it:Previous implementation of the
Person
class satisfies this interface. The fact that it lets the caller also set the properties is meaningless from the point of view of consumers (who consumeIPerson
). Additional functionality of the concrete implementation is taken into consideration by, for example, builder:In this code, consumer doesn't know about property setters - it is not his business to know about it. Consumer only needs getters, and he gets getters from the interface, i.e. from the contract.
Another completely valid implementation of
IPerson
would be an immutable person class and a corresponding person factory:In this code sample consumer once again has no knowledge of filling the properties. Consumer only deals with getters and concrete implementation (and business logic behind it, like testing if name is empty) is left to the specialized classes - builders and factories. All these operations are utterly impossible with fields.
A couple quick, obvious differences
A property can have accessor keywords.
A property can be overridden in descendents.