属性它是一个方法或一对方法,在客户端代码看来,它是一个字段。
属性可以拥有get、set访问器,get访问器不带任何参数,必须返回属性声明的类型。也不应该为set访问器指定任何显式参数,
但编译器假定它带一个属性所声明的类型的参数,表示为value。例如:
private string name; public string Name { set { name = value; } get { return name; } }
1、只读、只写属性
在属性定义中省略set访问器,就可以创建只读属性。
public string Name { get { return name; } }同样,在属性定义中省略get访问器,就可以创建只写属性。但是,这是不好的编程方式,因为这可能使客户端感到迷惑。一般情况下,如果要这么做,最好使用一个方法替代。
2、属性的访问修饰符
C#允许给属性的get和set访问器设置不同的访问修饰符,所以属性可以有公有的get访问器和私有或受保护的set访问器。这有助于控制属性的设置方式或时间。
- 没有任何访问修饰符的访问器,表示其具有属性的访问级别。如示例中的get访问器
- 在get和set访问器中,必须有一个具备属性的访问级别。如示例中get访问器的访问级别是protected,就会产生一个编译错误,因为这会使两个访问器的访问级别都不是属性。
private string name; public string Name { protected set { name = value; } get { return name; } }
3、自动实现的属性
如果属性的set和get访问器中没有任何逻辑,就可以使用自动实现的属性。这种属性会自动实现后备成员变量。不需要声明set和get。编译器会自动创建它。使用自动实现的属性,就不能在属性设置中验证属性的有效性。所以在上面的例子中,不能检查是否设置了非法字符。
- 自动实现属性必须同时定义get、set访问器。尝试把该属性设置为只读属性,就会出错。
- 每个访问器的访问级别可以不同,如Name2。
public string Name1{ get; set; } public string Name2{get; protected set;}
4、内联
我们不用担心通过属性访问字段,而不是直接访问字段 。这些额外的函数调用是否会增加系统开销,导致性能下降。C#代码会编译为IL,然后在运行时JIT编译为本地可执行代码。JIT编译器可生成高度优化的代码,并在适当的时候地内联代码 。如果实现某个方法或属性仅是调用另一个方法,或返回一个字段,则该方法或属性肯定是内联的。 但要注意、在何处内联代码完全由CLR决定。我们无法使用像C++中inline这样的关键字来控制哪些方法是内联的。