在设计类的成员的时候,尽量适用属性而不是字段(数据成员)。使用属性的优势有以下几点:
1.数据安全性检查:可在给属性赋值时候,进行安全性检查,实时抛出异常
2.属性可以是抽象的:在继承类中进行重写
3.属性可在接口中定义:在继承类中实现。结合第二点,均可以满足类的设计的弹性需求
4.可利用属性进行索引器的定义和适用:经常用在集合类的定义中
5.由于代码内敛的方式被编译器采用,采用属性性能并不比数据成员差多少。
简单代码示例:
{
class Info : MyAbstractCls, ImyInterface
{
public string Name;
private int age;
//1 属性的安全性检查
public int Age
{
set
{
if (age < 0 || age > 100)
{
throw new Exception("age is invalid");
}
else
{
age = value;
}
}
get
{
return age;
}
}
//重写抽象类中的抽象属性
public override string Dept
{
set;
get;
}
//实现接口中的方法和属性
public void foo()
{
//code here
}
public string Tel
{
set;
get;
}
}
//抽象类
abstract class MyAbstractCls
{
public void f()
{
Console.Write("a method in abstract class");
}
public abstract string Dept //2. 抽象属性的定义
{
get;
set;
}
}
//接口
interface ImyInterface
{
void foo();
string Tel { set; get; } //3. 接口中的属性定义
}
class MyBooks
{
List<string> lists=new List<string>();
//4.索引器的定义
public string this[int index]
{
get
{
return lists[index];
}
set
{
lists.Add(value);
}
}
public override string ToString()
{
string books = string.Empty;
foreach (string book in lists)
{
books += book + "\n";
}
return books;
}
}
}
{
static void Main(string[] args)
{
//索引器的应用
MyBooks books = new MyBooks();
books[0] = "Programming C#";
books[1] = "CLR vir C#";
books[2] = "Sql server 2008";
string myBooks= books.ToString();
Console.WriteLine(myBooks);
}
}
另外,通过分析IL,我们可以看出,虽然适用公有数据成员和属性在代码表现形式上一样,但其具体实现却不相同:属性在IL中被编译成get_xx,set_xx的两个方式进行。