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?

    The evolution of C# - Part III - C# 2.0 - Iterators

    It's been a while since i wrote the last post, but i did not forget my purpose of creating a series that shows the evolution of C#. Today i came here to talk about one of the most useful features of C#, even if you dont know you're using it. Let's talk about iterators ! What is an iterator? For those of you who didn't read about the iterator pattern somewhere in the internet or in the "Gang of Four" book, you can read a description  here . The iterator is a class/object/whatever which knows how to traverse a structure. So, if you have a list or collection of objects, an iterator would have the knowledge of how to traverse that collection and access each element that it contains. The iterator is a well known design pattern and is behind many of the wonderful that we have nowadays in .NET (Linq comes to mind). Why is it a feature? Truth be told, an iterator is a concept well known way before .NET even existed. Being an OO Design Pattern, the iterator has

    My simplest and most useful type

    I have been doing some introspection on the way I write code to find ways that I need to improve. I consider this a task that one must do periodically so that we keep organized. There is a very, very simple problem that occurs in every application I know: How to return the results of an operation to the user? I've seen many implementations. Some return strings, some throw exceptions, some use out parameters, reuse the domain classes and have extra properties in there, etc. There is a myriad of ways of accomplishing this. This is the one I use. I don't like throwing exceptions. There are certainly cases where you have no choice, but I always avoid that. Throughout my architectures there is a single prevalent type that hasn't changed for years now, and I consider that a sign of stability. It is so simple, yet so useful everywhere. The name may shock you, take a look: Yes, this is it. Take a moment to compose yourself. Mind you, this is used everywhere , in every