On the calling side, properties and fields generate different code. Fields are accessed directly, but properties call a function in the class to both get and set the value. If your class is in a separate DLL from the caller, and you later want to change it to a property because you no longer store the actual value, but can still derive it from other data, or you want to trigger other changes or notification when it is set, or you want to provide some kind of locking around the retrieval or changing of the valid, or any number of other reasons, you will have to recompile the calling DLL in order for it to work. If you use a property, you can change the implementation of the getter and/or setter and the calling code will work without recompiling.