理解 set get ,为什么用

来源:互联网 发布:养老保险报盘软件1.9 编辑:程序博客网 时间:2024/04/29 11:52
先看例子:
get set是用来扩展域的,也就是C里的变量,只是用起来更加灵活而己。看以下代码: 

using System; 
public class cls 

      private int book;//定义一个域(也可以叫变量,只是面向对像里都这么叫,使用起来也更加方便) 
      public int Book 
    { 
       get 
       { 
           Console.WriteLine("dsf"); 
           return book;  
        } 
      set 
       { 
           Console.WriteLine("aaa"); 
           book=value; 
       }  
 } 
       public static void Main() 
      { 
           cls obj = new cls(); 
           obj.Book = 120; //注意这一句 
           Console.WriteLine(obj.Book); 
       } 

运行结果为: 
aaa 
dsf 
120 
也就是先把120赋值给value(相当一个存储空间),然后再用get{}返回给Book,实际上也就是一次改变变量值的过程。 
那你也许会问为什么要这么复杂呢?因为这是用了嵌套,所以可以更加方便的写入其它语句,在以后你就应该学到了。 
如果没有: 
obj.Book = 120; 
请想一想会是什么结果呢? 
只是一个取值过程:get{}而没有执行set{} 
结果为: 
dsf 
0
 
2.使用属性代替可访问的数据成员(出处:http://blog.csdn.net/hy_lihuan/archive/2007/12/25/1967228.aspx)
 结论:只要打算将数据暴露在类型的公有接口或者受保护接口中,我们都应该使用属性来实现。对于具有序列或者字典特征的类型,则应该采用索引器。所有的数据成员都应一律声明为私有。(如果你熟悉属性语法、记住这个结论就可以了)
一、属性(property)和数据成员的基本语法:

public class Customer
 {
   private string _name;
   public string Name2;
   public string Name
   {
     get
     {
       return _name;
    }
    set
    {
      if (( value == null ) || ( value.Length == 0 ))
        throw new ArgumentException( "Name cannot be blank", "Name" );
      _name = value;
    }
  }
  // ……
}
//程序调用
Customer customerOne = new Customer();
customerOne.Name = "This Company, Inc."; //属性设置
customerOne.Name2 = "This Company, Inc."; //数据成员设置
string name = customerOne.Name;//属性获取
string name2 = customerOne.Name2;//数据成员获取
 
    从上面的语法可以看到属性和数据成员在使用上是一样的,但是在定义上还是有很大的区别的;
二、属性的优点:
1、可以得到更好的数据绑定支持;数据成员则不可以
2、可以更容易地在将来对其访问方法的实现做任何改变;
3、可以更容易的在属性上进行业务逻辑的限制;
四、属性和数据成员的性能比较:几乎没有区别
    使用属性和使用数据成员在性能上有什么差别。虽然使用属性不会比使用数据成员的代码效率更快,但是它也不见得就会比使用数据成员的代码慢,因为JIT编译器会对某些方法调用(包括属性访问器)进行内联处理。如果JIT编译器对属性访问器进行了内联处理,那么属性和数据成员的效率将没有任何差别。即使属性访问器没有被内联,实际的效率差别相对于函数调用的成本来讲也是可以忽略不计的。
五、讨论和理解
个人认为属性最大的好处就是符合面向对象和语言设计的要求,做到了多处使用(调用),一次修改的原则;毕竟在项目开展的过程中,修改是不可避免的,既然不能避免,那自然就需要考虑编程方式方便修改;属性在这方面做得不错,可以通过对属性的一些限制来保证UI调用的准确性并不需要在页面中去寻找需要限制的内容;事例可以看最上面的代码,这个Name属性就要求不能为null的,如果未null就会报错;这样就不需要在每一次调用这个属性的时候进行不能为空的监测工作,减少了代码错误的可能性;
至于书上面所说的数据成员修改属性这个问题,我觉得只要养成习惯,就不要再去使用数据成员了;就算是数据成员再修改成属性也没有什么大的问题(说上说的原因是编译以后部署会花费更多的时间),对项目的修改一定是在存在问题或者更新需求的情况下,因此重新编译的必要的,所以感觉不比讲究这些。
三、属性的特点:
1、我们可以针对成员函数做的任何事情,对于属性也同样适用。
因此属性可以实现为虚属性;也可以实现为抽象属性,或者作为接口定义的一部分;
2、在C# 2.0中,我们可以为一个属性的get访问器和set访问器指定不同的访问修饰符。(可以更好地控制属性的可见性)
3、索引器:索引器和一般的属性(即支持单个数据项的属性)在C#中有同样的语言支持,它们都用方法实现,我们可以在其内部做任何校验或者计算工作。索引器也可以为虚索引器,或者抽象索引器。它们可以声明在接口中,也可以成为只读索引器或者读—写索引器。以数值作为参数的“一维索引器”还可以参与数据绑定。使用非数值的索引器则可以用来定义map或者dictionary等数据结构; 
注意:在每个类型中,对于同样的参数列表,我们只能有一个索引器。
//索引器定义
public int this [ int index ]
{
  get
  {
    return _theValues [ index ] ;
  }
  set
  {
    _theValues[ index ] = value;
  }
}
// 访问索引器:
int val = MyObject[ i ];
//多维索引器定义
public int this [ int x, int y ]
{
  get
  {
    return ComputeValue( x, y );
  }
}
public int this[ int x, string name ]
{
  get
  {
    return ComputeValue( x, name );
  }
}