Skip to main content

C# 2.0 - Property Acessor Accessibility

Let's talk about accessor's accessibility introduced in C# 2.0. This is a tiny little feature that can make your life easier in a number of ways. But first, let's define what i am talking about. Normally, a property is composed this way:

So, from the example above, we can see that a property has a backfield (called _myProperty) and is composed by a getter and a setter. The getter is called whenever you get the value of that property. The setter is called when you set it's value. If we look carefully, we notice that the getter returns the value of the backfield, and the setter sets it's value, respectively.

If we think about it, a property is nothing more than a wrapper around a private field. This way we can control all the access to that field's value. C#'s properties are nothing more than sintactic sugar for the following structure:


This is an "old school property". In languages where you don't really have the concept of property, that's the way you control the access to a value from outside sources. Now, we can see that if we do it this way, we can change the accessibility for the get and the set methods independently. Back in C# 1.0, it was not possible to do this with a property sintax. If you defined you property public, you could get and set it's value from anywhere. How would you make a read-only property that you could write to inside your class?  You'd have to use the "old syntax".

Thankfully, C# 2.0 brings us the Accessor Accessibility. This feature let's us vary the getter and setter accessibility independently. So, back to our read-only problem, we would define the property like this:

So, this property is now writable only inside the class declaring it. You could do the same thing and only let the property be read inside the class. Of course there are some rules to this. The following is a copy-paste of the restrictions applied from here, with my brief and shallow explanation on the subject below.


  • You cannot use accessor modifiers on an interface or an explicit interface member implementation.
  • I think none of the members of an interface can have an accessor modifier, so this is pretty reasonable. The members in the interface have the same accessibility as the interface itself because when you implement an interface you say that a class definitely has those members, and it would not make sense to hide some of them.
    • You can use accessor modifiers only if the property or indexer has both set and get accessors. In this case, the modifier is permitted on one only of the two accessors.
    So, you can't specify the getter protected and the setter private. In other words, one of the accessors must be of the same accessibility of the property itself. If you declared the property public, the getter protected and the setter private, what would you be declaring public anyway?

    • If the property or indexer has an override modifier, the accessor modifier must match the accessor of the overridden accessor, if any
    This means that you can't redefine the accessibility of an accessor that is inherited from a parent class. If you could, it would be possible to override the accessibility by upcasting a variable of a base class, in some cases. So, this will not compile 


    • The accessibility level on the accessor must be more restrictive than the accessibility level on the property or indexer itself.
    This is the most evident one. How can a getter be public when it's property is private? 


    Wrap up:
    Accessibility on property accessors are a convenient feature that allows you to have more control over how outside code interacts with your's. This is not a feature that you will use frequently but it's nice to know that it will be there when time comes.

    Comments

    Popular posts from this blog

    The repository's repository

    Ever since I started delving into architecture,  and specifically service oriented architecture, there has been one matter where opinions get divided. Let me state the problem first, and then take a look at both sides of the barricade. Given that your service layer needs to access persistent storage, how do you model that layer? It is almost common knowledge what to do here: use the Repository design pattern. So we look at the pattern and decide that it seems simple enough! Let's implement the shit out of it! Now, let's say that you will use an ORM - here comes trouble. Specifically we're using EF, but we could be talking about NHibernate or really any other. The real divisive theme is this question: should you be using the repository pattern at all when you use an ORM? I'll flat out say it: I don't think you should... except with good reason. So, sharpen your swords, pray to your gods and come with me to fight this war... or maybe stay in the couch? ...

    Follow up: improving the Result type from feedback

    This post is a follow up on the previous post. It presents an approach on how to return values from a method. I got some great feedback both good and bad from other people, and with that I will present now the updated code taking that feedback into account. Here is the original: And the modified version: Following is some of the most important feedback which led to this. Make it an immutable struct This was a useful one. I can't say that I have ever found a problem with having the Result type as a class, but that is just a matter of scale. The point of this is that now we avoid allocating memory in high usage scenarios. This was a problem of scale, easily solvable. Return a tuple instead of using a dedicated Result type The initial implementation comes from a long time ago, when C# did not have (good) support for tuples and deconstruction wasn't heard of. You would have to deal with the Tuple type, which was a bit of a hassle. I feel it would complicate the ...

    C# 2.0 - Partial Types

    For those of you interested, i found a very interesting list of features that were introduced in C# in  here . This is a very complete list that contains all the features, and i'm explaining them one by one in this post series. We've talked about  Generics  and  Iterators . Now it's time for some partial types . A partial type  is a type which definition is spread across one or more files. It doesn't have to be in multiple separated files, but can be. This is a very simple concept that can give us many benefits, let's see: If a type is partial, multiple developers can work on every part of it. This allows a more organized way of working and can lead to production improvement.  Winforms , for example, generates a partial class for the form so that the client can separately edit other parts it. This way, a part contains information about the design and the other contains the logic of the form. In fact, this is a very spread pattern across .Net. Ent...