Click here to Skip to main content
15,884,836 members
Articles / Programming Languages / C#

Properties C# 2.0 - Not Elegant Enough !!!

Rate me:
Please Sign up or sign in to vote.
3.67/5 (3 votes)
1 Aug 2010CPOL1 min read 10.1K   2
Properties C# 2.0 are not elegant enough

Prior to .NET 2.0, there wasn't the facility in C# to opt the visibility level for the get and set properties or indexers. And I take my comment in my previous post that C# does not provide the facility of having different visibility levels for the get and set accessors. While that is partly correct, it is no more in C# 2.0.

And obviously, it isn't in the easy and elegant way. Take a look at this code snippet:

C#
public bool LogToStdError
{
   get
   {
      return _log2StdError;
   }
   protected set
   {
      _log2StdError = value;
   }
}

I do not have to explain the code except that there are some restrictions while having different visibility levels for the get/set accessors of a property.

  1. You can provide an explicit visibility either for get or set. Hence the following code will throw an error:
    C#
    public  bool LogToStdError
    {
       protected get
       {
          return _log2StdError;
       }
       protected set
       {
          _log2StdError = value;
       }
    }
  2. The visibility thus explicitly specified must be a subset [restrictive than] of the property declaration. For example, if the property declaration is protected, then the get/set accessor cannot be like say public. So the following code throws an error:
    C#
    protected  bool LogToStdError
    {
       get
       {
          return _log2StdError;
       }
       public  set
       {
          _log2StdError = value;
       }
    }

I feel that these restrictions are stupid, and this resulted because of the syntax. I just thought of some ideas for a bit elegant syntax for the property definition.

  1. The get and set accessors individually have to specify the visibility level.
    C#
    bool  LogToStdError
    {
       public  get
       {
          return _log2StdError;
       }
       protected set
       {
          _log2StdError = value;
       }
    }
  2. The property declaration syntax must not bear any visibility level unless the associated get/set accessors do not bear any. For example, in the property definition below, the get/set accessors are public:
    C#
    public  bool LogToStdError
    {
       get
       {
          return _log2StdError;
       }
       set
       {
          _log2StdError = value;
       }
    }

    and as per this property definition, the get/set accessors are protected:

    C#
    protected  bool LogToStdError
    {
       get
       {
          return _log2StdError;
       }
       set
       {
          _log2StdError = value;
       }
    }
  3. If there are visibility levels specified neither in the property definition nor in the accessors, then the default visibility level as specified for C# [I guess internal] will be applied for the property accessors. Hence the get/set accessors are internal for the following property:
    C#
    bool  LogToStdError
    {
       get
       {
          return _log2StdError;
       }
       set
       {
          _log2StdError = value;
       }
    }

License

This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)


Written By
Architect
United States United States
This member has not yet provided a Biography. Assume it's interesting and varied, and probably something to do with programming.

Comments and Discussions

 
General[My vote of 2] Interesting, but... Pin
Kubajzz30-Jul-10 5:59
Kubajzz30-Jul-10 5:59 
Interesting article, I really enjoyed reading it, but I have to disagree with almost everything you said.

First of all, I don't think the way get and set accessors are defined can be made any more elegant.

It makes sense that you can explicitly define the visibility of only one of the accessors. See the following example:
public bool Flag { private get; private set; }

If you could set the visibility for both get and set accessors, you could create a property like the one above. Such property is public, but both its accessors are private. It means that the property is visible to the "outer world", but it can't be read nor written and therefore is absolutely useless... And declaring the entire property private would do the same.

It also makes sense that the visibility modifiers of get and set must be more restrictibe then the property modifier. See this example:
private bool Flag { public get; set; }

The code above violates the rule and even if it was possible to create a property like this, it would be useless. If you declare a property as private, then the entire property is invisible to the "outer world". Therefore it doesn't make any sense to make one of it's accessors visible, if the property itself is invisible.

As for the new syntax you suggest, I have to disagree again. Anyway, this post is already a bit too long, so... Thanks again for the interesting reading and have a nice day Smile | :)
GeneralRe: [My vote of 2] Interesting, but... Pin
kb-boxer1-Aug-10 20:32
kb-boxer1-Aug-10 20:32 

General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Praise Praise    Rant Rant    Admin Admin   

Use Ctrl+Left/Right to switch messages, Ctrl+Up/Down to switch threads, Ctrl+Shift+Left/Right to switch pages.