65.9K
CodeProject is changing. Read more.
Home

Properties C# 2.0 - Not Elegant Enough !!!

starIconstarIconstarIcon
emptyStarIcon
starIcon
emptyStarIcon

3.67/5 (3 votes)

Jul 30, 2010

CPOL

1 min read

viewsIcon

10280

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:

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:
    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:
    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.
    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:
    public  bool LogToStdError
    {
       get
       {
          return _log2StdError;
       }
       set
       {
          _log2StdError = value;
       }
    }

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

    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:
    bool  LogToStdError
    {
       get
       {
          return _log2StdError;
       }
       set
       {
          _log2StdError = value;
       }
    }