.net 基础之属性

会使用属性已经好长时间了,但是不知道为什么要使用属性,使用属性能带来什么好处

如果我们定义了一个Person类

public class Person
{
      public string name;
      public Int32 age;

      public Person(string name,Int32 age)
      {
             this.name = name;
             this.age = age;
      }
}
View Code

当我们在类中这样定义了字段之后。在使用一个这个类型的一个引用的时候我们可能会写出这样的代码

Person person = new Person();
person.age = -5;
View Code

这样的代码写出来之后没有编译错误,但是这是非常不符合实际情况的一个人的年龄怎么能够使-5呢??

public class Person
{
      private string name;
      private Int32 age;

      public void Set_Name(string name)
      {
            this.name = name;
      }
      public String Get_Name()
      {
           return name;
      } 
     
      public void Set_Age(Int32 age)
      {
            if(age < 0)
            {
                  throw new ArgumentException("value",age.ToString(),"the age must be bigger than 0");
            }
            this.age = age;
      }

      public Int32 Get_Age()
      {
            return age;
      }
}

这样之后我们是不能直接给name和age赋值的,我们如果要访问name和age必须要使用get和set来封装字段。这样给我们带来的好处是

    1  可以使用线程安全来访问字段。 2 如果字段是一个逻辑字段。她的值不值内存中的字节,是要计算的得到的。

    将字段声明为private就能够达到上面的要求

当我们使用get和set的方式来封装了字段之后又两个缺点

   1. 不得不实现额外的方法来对字段封装。无形之中添加的很多的代码量

   2. 用户在使用字段的使用必须调用方法。这样给人的感觉是不是很好的

Person p = new Person();
p.Set_Name("hanxingzhi");
string Name = p.Get_Name();
p.Set_Age(-5);//这里当我们调用这个方法时是不能对age字段赋值的,因为在方法的内部对传入的参数进行了判断。这是会抛出异常的
View Code

在CLR中使用了属性的方式来代替了get和set方式对字段的访问封装。同时这还可以避免上面的两个缺点

public sealed class Person
{
      private string name;
      private Int32 age;
 
      public String Name{ get {return name;} set { name = value;}}

     public Int32 Age
    {
          get { return age;}
          set 
         {
                if(value < 0)
                     throw new ArgumentException("value",value.ToString(),"the age must be bigger than 0");
               age = vlaue;
         }
    }
}
View Code

其实上面给的代码在编译器编译的时候也是要编译成get和set形式的封装字段。

属性的控制

 1. 实现只读或者只写字段  

     public String Name{ get { return name;}}//只读字段

     当把字段写成这样的形式时。在编译器变成的代码中没有SetXXX方法。只有一个GetXXX方法。

     public String Name{ set { name = value;}}//只写字段

     同理与只读字段

2  如果在定义属性的时候使用的是别的访问修饰符 如 protected private 那么生成的get和set方法同样会成为 protected private...

3  单独的控制 public String Name{} 暂时先放着。

 

供自己学习使用

.net 基础之属性,古老的榕树,5-wow.com

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。