1 简单demo
以下是一个常见的属性的使用。其中Name 属性没有定义私有字段,而AGE定义了已有字段。
// This property is an automatically implemented property
public String Name { get; set; }
private Int32 m_Age;
public Int32 Age {
get { return(m_Age); }
set {
if (value < 0) // The 'value' keyword always identifies the new value.
throw new ArgumentOutOfRangeException("value", value.ToString(),
"The value must be greater than or equal to 0");
m_Age = value;
}
}
}
2使用reflactor分析
public sealed class Employee
{
// Fields
[CompilerGenerated]
private string <Name>k__BackingField;
private int m_Age;
// Methods
public Employee()
{
base..ctor();
return;
}
// Properties
public int Age
{
get
{
int CS$1$0000;
CS$1$0000 = this.m_Age;
Label_000A:
return CS$1$0000;
}
set
{
bool CS$4$0000;
if (((value < 0) == 0) != null)
{
goto Label_0023;
}
throw new ArgumentOutOfRangeException("value", &value.ToString(), "The value must be greater than or equal to 0");
Label_0023:
this.m_Age = value;
return;
}
}
public string Name
{
[CompilerGenerated]
get
{
string str;
str = this.<Name>k__BackingField;
Label_0009:
return str;
}
[CompilerGenerated]
set
{
this.<Name>k__BackingField = value;
return;
}
}
}
Collapse Methods
我们可以看到他自动生成了:
1 SET 方法
2 Get方法
3使用属性的提醒:
1 属性可以是只读或者只写或读写皆可,而字段通常是可读可写。
2 对属性赋值或取值时可以进行逻辑处理,而字段不可用。
3 属性不能Ref 和Out ,字段可以。
4 属性的读取可能花费较长时间,总是比字段长。在一些需要更快的读写的场合可以使用字段。
5 在一行代码中多次调用属性可能不一样。如取时间。听说这是MS的一个败笔。
属性是这样的成员:它们提供灵活的机制来读取、编写或计算私有字段的值。 可以像使用公共数据成员一样使用属性,但实际上它们是称作“访问器”的特殊方法。 这使得可以轻松访问数据,此外还有助于提高方法的安全性和灵活性。--来自MSDN的解释
4我对属性的理解:
属性与字段的异同:
相同:都是表示类的一个数据(如人的身高、体重等)。
不同:属性对外部和派生类开放。这也解释了为什么需要加逻辑验证。
字段对内部开放。提供更快的性能,更少的验证,信任程序员。
5 属性需要定位吗?
用以上的准则为指导。那么遇到下面的情况又该怎么办?
public sealed class Good {
// This property is an automatically implemented property
public Int32 Guality { get; set; }
private Int32 _price;
public Int32 Price {
get { return (_price); }
set {
if (value < 0) // The 'value' keyword always identifies the new value.
throw new ArgumentOutOfRangeException("value", value.ToString(),
"The value must be greater than or equal to 0");
_price = value;
}
}
//性价比
public Int32 CostPerformance {
get {
return Guality / _price;
}
}
}
属性的定位应该是怎么样?什么时候用属性?性价比算是他的一个数据吗?应该是使用方法的形式还是属性的形式?如果是以属性的方式提供那么他不是与方法的定位冲突了吗?
欢迎讨论!
6扩展阅读
Effective C# 原则1:尽可能的使用属性(property),而不是数据成员(field)。
C#中属性的一个容易搞错的问题 即:SET和GET的不一定一样