C#中的属性-Property

 

C#的属性一直都有用,但具体了解的不是很深,而且一些注意事项也没有太在意过,糊里糊涂的用着。这两天看了C#的书专门学习了一下属性,这才知道,原来属性也有这么多东西~ ~今天记录一下,算是对学习的一个检验吧。 属性的本质是方法,是字段的封装形式,对外界提供字段的访问功能,避免外界直接接触到字段,有点经纪人的意思。属性包含两个访问器,一个是get,一个是set,通过get访问器外界可以通过属性获取相应的字段的值;通过set访问器,外界可以传递值给set访问器默认包含的变量value,来更改字段的值。属性的定义很简单,如下:

  private int _num;
 public int Num{
     get
    {
         return this._num;
    }
     set
    {
         this._num = value;
    }
}

PS:为了区分字段与属性,字段的命名通常以下划线“_”开头。 除了上面这种格式的属性,C#还提供了一种书写更加简单的属性,称为自动属性,自动属性最大的特点就是省去了字段的声明(C#自动帮你做了),而且get和set访问器不包含方法体,只用一个";"结尾,for example:

  public int Num
{
     get;
     set;
}

是不是简化了不少?而且使用起来和普通的属性一样。 通过上述的两种格式,外界可以对字段进行读写,但是有的时候我们可能只想开放一部分功能,比如只读或者只写。实现属性的只读或者只写,C#提供了两种方式:

  1. 通过隐藏get或者set访问器来实现只读或者只写。example:

private int  _num;
// 只读属性
public int Num{
   get{
       return this._num;
  }
}
// 只写属性
public int Num{
   set{
       this._num = value;
  }
 //自动属性的只读:
 public int Num{
     get;
}
}

PS:对于自动属性而言,必须包含get访问器,所以无法通过隐藏get访问器来实现只写属性

  1. 通过给get和set访问器添加访问修饰符来实现属性的只读或者只写。example:

private int _num;
 public int Num{
 //只写
     private get
    {
         
    }
     set
    {
         this._num = value;
    }
}
 
 public int Num{
 //只读
     private get
    {
         return this._num;
    }
     private set
    {
         
    }
}
 //自动属性
 public int Num{
 //只写
     private get;
     set;
}
 public int Num{
 //只读
     get;
     private set;
}

note: 属性在通过给访问器添加访问修饰符来实现只读或着只写功能时,get和set访问器必须同时存在,而且访问器的访问修饰符的限制一定要大于属性的访问修饰符,例如:Num的访问修饰符为Public,那访问器的访问修饰符限制就要比属性的大,所以可以为private或者protected,但不可以是public。

属性的只读和只写的功能实现就写到这了,下面说一下属性的初始化。属性的初始化,也包含两种方法,一种是通过构造函数,另一种则是在声明的时候进行初始化。第一种方法,都很熟悉,和字段的初始化一样。这里说一下第二种,因为我也是第一次见到这种写法,先上代码:

  public int Num{get; set;} = int.MaxValue;

需要注意的是,只有自动属性可以使用这种初始化方式,普通的属性不可以这样初始化。

属性的特性内容差不多就这些了,下面说一下属性在接口中的使用。接口中允许包含的内容有:属性方法事件索引器,而属性在接口中的使用,有点类似自动属性,但是没有访问修饰符修饰,具体的访问修饰符根据派生类的需求进行选择。example:

  interface IHuman{
     int Age{get; set;}
}
 
 class Man:IHuman{
     public int Age{get; set;}
}

是不是和自动属性很像,不同的是,接口中的属性可以通过省略get来实现只读属性,而自动属性不可以这么做。

扫描二维码关注公众号,回复: 4469987 查看本文章

属性的使用,除了接口或者类中之外,有的时候还会出现在结构体中。具体的使用都和上述一样,但有一点需要注意:结构体可以在不使用new进行定义的情况下使用,但是上面我们已经说过了,属性的本质是方法,所以在不是使用new进行定义的情况下,调用属性是会出现编译错误的,这个一定要切记。 好了,该睡觉去了。

PS:以上均是自己学习之后理解所写,水平有限难免会出现错误之处,总是唯恐给阅读到小伙伴造成误导,所以希望能够以质疑的态度去浏览,也希望小伙伴能够批评指出,共同成长。

 

猜你喜欢

转载自www.cnblogs.com/iNeXTs/p/10106295.html