I don’t know why I started thinking about this, but now I can’t seem to stop.
In C# – and probably a lot of other languages, I remember that Delphi used to let you do this too – it’s legal to write this syntax:
class WeirdClass
{
private void Hello(string name)
{
Console.WriteLine("Hello, {0}!", name);
}
public string Name
{
set { Hello(name); }
}
}
In other words, the property has a setter but no getter, it’s write-only.
I guess I can’t think of any reason why this should be illegal, but I’ve never actually seen it in the wild, and I’ve seen some pretty brilliant/horrifying code in the wild. It seems like a code smell; it seems like the compiler should be giving me a warning:
CS83417: Property ‘Name’ appears to be completely useless and stupid. Bad programmer! Consider replacing with a method.
But maybe I just haven’t been doing this long enough, or have been working in too narrow a field to see any examples of the effective use of such a construct.
Are there real-life examples of write-only properties that either cannot be replaced by straight method calls or would become less intuitive?
Write-only properties are actually quite useful, and I use them frequently. It’s all about encapsulation — restricting access to an object’s components. You often need to provide one or more components to a class that it needs to use internally, but there’s no reason to make them accessible to other classes. Doing so just makes your class more confusing (“do I use this getter or this method?”), and more likely that your class can be tampered with or have its real purpose bypassed.
See “Why getter and setter methods are evil” for an interesting discussion of this. I’m not quite as hardcore about it as the writer of the article, but I think it’s a good thing to think about. I typically do use setters but rarely use getters.