Should I use a Field or Property within the class to set values
<p>So I got into a friendly argument with a co-worker over a piece of code:</p>

<pre><code>public sealed class NewObject
{
    private string _stuff = string.Empty;

    public string Stuff
    {
        get { return GetAllStuff(); }
    }

    private string GetAllStuff()
    {
        //Heavy string manipulation of _stuff
    }

    public NewObject(string stuffToStartWith)
    {
        _stuff = stuffToStartWith;
    }

    public static NewObject operator +(NewObject obj1, NewObject obj2)
    {
        if (obj1 == null)
            throw new ArgumentNullException();

        if (obj2 == null)
            throw new ArgumentNullException();

        NewObject result = new NewObject(string.Empty);
        result._stuff = String.Concat(obj1._stuff, obj2._stuff);

        return result;
    }
}
</code></pre>

<p>The argument was over the operator override.  My co-worker feels that it's not best programming practice to set values of private fields anywhere but the constructor.  The solution proposed by my co-worker was to refactor the name of the <code>Stuff</code> property to <code>AllStuff</code> and add a property, <code>Stuff</code>, that has a <code>get</code> AND <code>set</code> accessor and use the new <code>Stuff</code> property in the operator override.  Making it look like this:</p>

<pre><code>    public static NewObject operator +(NewObject obj1, NewObject obj2)
    {
        if (obj1 == null)
            throw new ArgumentNullException();

        if (obj2 == null)
            throw new ArgumentNullException();

        NewObject result = new NewObject(string.Empty);
        result.Stuff = String.Concat(obj1.Stuff, obj2.Stuff);

        return result;
    }
</code></pre>

<p>I disagree.  I feel the first way is better since it keeps the property read-only outside the class.  My question is, which way is the best practice for object-oriented design?</p>
