在设计类的成员的时候,尽量适用属性而不是字段(数据成员)。使用属性的优势有以下几点:
      1.数据安全性检查:可在给属性赋值时候,进行安全性检查,实时抛出异常
      2.属性可以是抽象的:在继承类中进行重写
      3.属性可在接口中定义:在继承类中实现。结合第二点,均可以满足类的设计的弹性需求
      4.可利用属性进行索引器的定义和适用:经常用在集合类的定义中
      5.由于代码内敛的方式被编译器采用,采用属性性能并不比数据成员差多少。    

      简单代码示例:

 EffectiveCSDemo
{
    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 { setget; } //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;
        }
    }
}
      
 Program
    {
        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的两个方式进行。

相关文章: