none
关于c#3.0 对象初始值设定项的 疑问 RRS feed

  • 问题

  •         public string Name { get; set; }
            public int Age { get; set; }

            static void Main(string[] args)
            {
                var cat = new Cat { Name = "BoSi", Age = 3 };
            }

    这段代码我是能够理解的;




        public class Cat
        {
            public string Name { get; set; }
            public int Age { get; private set; }

            static void Main(string[] args)
            {
                var cat = new Cat { Name = "BoSi", Age = 3 };
            }
        }

    这段代码我就不能理解了,对Age属性设置了只读,那么Age字段的值怎么赋予呢?如果这个值没有值,那么有这个属性还有意义吗?请帮忙解答一下。

    2010年3月10日 14:56

答案

  • 我不确定是否明白楼主的意思。
    Age属性只是设置了公开get,私有set,而不是只读,只读的话,应该是这样的:
    public int Age { get; }
    因为它是private set,因此包含这个属性的类内的成员是可以对它进行设置的。如果是只读属性,可以在声明的时候赋值:
    public int Age 
    {
        get 
        {
           return 28;
        }
    }



    理解的越多,需要记忆的就越少
    2010年3月11日 0:57
    版主
  • 你好!
         你的疑问应该是这行代码吧:
         public int Age { get; private set; } 
         这里和过去不同之处是在属性的set访问器上设置了访问修饰符,这个特性是从C#2.0开始支持的,当然自动属性是从C#3.0开始支持的!
         给set访问器上设置了访问修饰符private的意思是只能在类的定义内部来设置这个属性,而这个类的用户是无法设置这个属性的!
    周雪峰
    2010年3月11日 2:27
    版主

全部回复

  • 你这个main在class cat里面么?那就被认为是一个类成员函数了,对所有成员有访问权限,测试的话要把这个main放其他类里。

    不能赋予的就是只读咯,用处很多,比如 String.Length ,这个就是只读的,不能让别人给改写了,否则就乱套了。


    霸王
    2010年3月10日 18:29
  • 你这个main在class cat里面么?那就被认为是一个类成员函数了,对所有成员有访问权限,测试的话要把这个main放其他类里。

    不能赋予的就是只读咯,用处很多,比如 String.Length ,这个就是只读的,不能让别人给改写了,否则就乱套了。


    霸王

    谢谢。但是我问的意思是: 像上面的这个只读属性Age,它的值永远是 0 了。
    2010年3月11日 0:38
  • 我不确定是否明白楼主的意思。
    Age属性只是设置了公开get,私有set,而不是只读,只读的话,应该是这样的:
    public int Age { get; }
    因为它是private set,因此包含这个属性的类内的成员是可以对它进行设置的。如果是只读属性,可以在声明的时候赋值:
    public int Age 
    {
        get 
        {
           return 28;
        }
    }



    理解的越多,需要记忆的就越少
    2010年3月11日 0:57
    版主
  • 这和 3.0 没有关系,自从 1.0 开始就是这样了,只有在类的内部才可以这样使用。原因很简单,在类的内部可以访问类中声明的 private 方法、属性或字段。
    知识改变命运,奋斗成就人生!
    2010年3月11日 1:10
    版主
  • 你好!
         你的疑问应该是这行代码吧:
         public int Age { get; private set; } 
         这里和过去不同之处是在属性的set访问器上设置了访问修饰符,这个特性是从C#2.0开始支持的,当然自动属性是从C#3.0开始支持的!
         给set访问器上设置了访问修饰符private的意思是只能在类的定义内部来设置这个属性,而这个类的用户是无法设置这个属性的!
    周雪峰
    2010年3月11日 2:27
    版主