Welcome

首页 / 软件开发 / C# / C#3.0新特性(三)-详说自动属性和匿名类型

C#3.0新特性(三)-详说自动属性和匿名类型2010-07-27 博客园 山高月大写在前边:

不知道怎么的,上一篇说放到首页看看,今天来看才发现没有放上去,做事情还真不细心,改、改、改!其实,早知道C# 4.0都有了,但是连C# 3.0都还没有弄清楚,使用还是坚持这个系列,做完再写C# 4.0吧。技术前辈们肯定早都知道这些东西了,不过呢,我也只是学习,只是把我的学习同大家分享而已!

一、自动实现的属性

全称应该叫自动实现的属性(Auto-implemented properties),在上一篇中,给了简单的例子,说的是当属性访问器中不需要其他逻辑时,自动实现的属性可使属性声明变得更加简洁。如前边的例子,在C# 2.0中:

private int m_one;
public int One
{
get { return m_one; }
set { m_one = value; }
}

这个属性只有存(set)取(get)逻辑,没有其它诸如动态分配、或是按条件存取的逻辑,在C# 3.0中,完全可以写成:

public int One { get; set; }

从而不需要创建与该属性对应的私有变量。

自动实现的属性必须同时声明get和set访问器。若要创建readonly自动实现属性,请给予它private set访问器。如:

public string Name { get; private set; }

这样,这个属性只读,不能对其进行存操作。那有人肯定要问,要给Name赋值,怎么办。仔细理解这个private set的含义,在面向对象的概念中,private表示在自己类的内部还是可以访问的,也就是,这里说的只读属性,在定义这个属性的类本身中,还是可以访问的,如下:

public class EDClass
{
public string Name { get; private set; }
public EDClass()
{
Name = "qq";
}
public void setName()
{
Name = "qq";
}
}

这样是完全没有问题的,但是,如果通过obj.Name = value肯定不行的,要不然就不叫readonly了。例如:

EDClass cls = new EDClass();
cls.Name = "qq";

报错:The property or indexer "CSharpStudy.EDClass.Name" cannot be used in this context because the set accessor is inaccessible

还有一点需要说明,自动实现的属性(Property) 不允许具有属性 (Attribute)。如果您必须在属性(Property) 的后备字段上使用属性(Attribute),则应该只创建常规属性(Property)。好绕口,仔细分析这些概念,在面向对象的概念中,类的成员(member)又称为属性(Attribute),其实,在一般来讲,在C++中称为成员(Member)变量,在C#中称为属性(Attribute),或字段。而这里的自动属性用的是Property,试想,定义了一个自动属性:

public string Name { get; set; }

又想定义一个私有成员(属性,Attribute)与之关联:

private string _name;

不会报错,但是肯定关联不了,它只被认为是类的一个私有成员变量。