Click here to Skip to main content
65,938 articles
CodeProject is changing. Read more.
Articles
(untagged)

Properties C# 2.0 - Not Elegant Enough !!!

0.00/5 (No votes)
1 Aug 2010 1  
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 has no explicit license attached to it but may contain usage terms in the article text or the download files themselves. If in doubt please contact the author via the discussion board below.

A list of licenses authors might use can be found here