views:

593

answers:

6

I have the simple class using auto-implemented properies:

Public Class foo
{
    public foo() { }  

    public string BarName {get; set;}
}

I obviously use the variable BarName throughout my class and now need to add logic when the property value is set (it must be all upper case, go figure). Does this mean that I need to now create a private variable for BarName , e.g. _BarName, and change the current BarName variable used throughout my class to _BarName?

Public Class foo
{
    public foo() {}  

    private string _BarName = "";
    public string BarName 
    { 
        get {return _BarName;}
        set {_BarName = Value.ToString().ToUpper();}
    }
}

I am trying to make sure I understand the implications of using auto-implemented properties, and what it will entail down the road when/if I need to change something. I am assuming that the refactoring, as shown above, is not a breaking change because the property is basically staying the same; it just took a little work inside the class to keep it that way and add the needed logic.

Another example, which may be more meaningful is that I need to call some method when a setter or getter is used; more then changing the value.

This seems a fair trade off the the lines and lines of code to setup properties.

+5  A: 

You don't need to change anything. Auto-implemented properties are just syntactic sugar. The compiler is generating the private variable and get/set logic for you, behind the scenes. If you add your own getter/setter logic the compiler will use your code instead of its auto-generated code, but as far as the users of that property are concerned, nothing has changed; any code referencing your property will continue to work.

Seth Petry-Johnson
OK. But to introduce logic to the setter and getter, I need to change the code as I did in my example, correct?
Brettski
Yes, it'll work fine. Calling ToString() on a string is a little redundant, but it won't hurt anything.
Matthew Scharley
What if I need to call some method when a getter or setter is called?
Brettski
Brettski: I'm not sure I understand... you can call a method from the getter/setter of a property, just like you can do from any other method. The get {...} and set {...} constructs are themselves just syntactic sugar: the compiler generates getFoo() and setFoo() methods behind the scenes.
Seth Petry-Johnson
A: 

You are correct about the refactoring and it really shouldn't break anything.

Whether or not you actually need to go through the references within the class to the property name and change those to refer to the private field would depend on whether the internal code needed to access the underlying representation of the data rather than how it was presented to consumers of the class. In most cases you could leave well enough alone.

In your simple example it would be wise to leave well enough alone and ensure that no code internal to the class could subvert the conversion/formatting being performed in the setter.

If on the other hand the getter was doing some magic to change the internal representation of the field into the way consumers needed to view the data then perhaps (in some cases) the internal code within the class would need to access the field.

You would need to look at each occurrence of the access to the auto-property in the class and decide whether it should be touching the field or using the property.

Hamish Smith
+4  A: 

When using automatic properties you don't get direct access to the underlying "backing" variable and you don't get access to the actual logic that gets implemented in the property getter and setter. You only have access to the property (hence using BarName throughout your code).

If you now need to implement specific logic in the setter, you can no longer use automatic properties and need to implement the property in the "old fashioned" way. In this case, you would need to implement your own private backing variable (the preferred method, at least for me, is to name the private backing variable the same name as the property, but with an initial lowercase (in this case, the backing variable would be named barName). You would then implement the appropriate logic in the getter/setter.

In your example, you are correct that it is not a breaking change. This type of refactoring (moving from automatic properties to "normal" properties should never be a breaking change as you aren't changing the public interface (the name or accessibility of the public property).

Scott Dorman
A: 

Automatic properties are just syntactic sugar, the compiler in fact creates the private member for it, but since it's generated at compile time, you cannot access it.

And later on, if you want to implement getters and setters for the property, only then you create a explicit private member for it and add the logic.

David Lay
+3  A: 

Does this mean that I need to now create a private variable for BarName

Yes

and change the current BarName variable used throughout my class

Do not change the rest of the code in your class to use the new private variable you create. BarName, as a property, is intended to hide the private variable (among other things), for the purpose of avoiding the sweeping changes you contemplate to the rest of your code.

I am assuming that the refactoring, as shown above, is not a breaking change because the property is basically staying the same; it just took a little work to keep it that way and add the needed logic.

Correct.

hurst
Ah, so I myself use the property to access the variable? Can't really do that if it's read only. The code I meant that needed changing is /inside/ the class
Brettski
In your example, it is not read-only. However, now that you bring it up, my response it that you can make the property publicly readable and privately settable using { get; private set; } pattern, which will allow you to write to it from inside your class.
hurst
A: 

Don't use automatic properties if you know that you are going to validate that object. These objects can be domain objects etc. Like if you have a Customer class then use private variables because you might need to validate the name, birthdate etc. But if you are using a Rss class then it will be okay to just use the automatic properties since there is no validation being perform and the class is just used to hold some data.

azamsharp