C#中set get用法

作者:admin来源:自编 日期:2021/3/1 17:09:42浏览次数:

为什么会出现set和get 

在面向对象编程中,用户只需要知道对象(object)能做什么,而不需要知道其如何完成的,也就是说不允许访问其内部,这体现了面向对象的封装原则。

面向对象的3个基本原则:

封装(Encapsulation)

多态(Polymorphism)

继承(Inheritance)

一般来说,域(field)是私有的,域表示存储位置,域的类型可以是C#中的任何数据类型。在C#中,属性(property)是这样一种语言元素,它们在被访问的时候看起来好像是数据成员,但是它们却是用方法实现的,因为属性不表示存储位置,这是属性和域的根本性的区别。一般的命名习惯 field: _xxx 对应的属性: xxx.。狭义区分一下,Get和Set实现的称为属性,其他的变量称为数据成员。

对所有有必要在类外可见的域,C#推荐采用属性来表达。属性提供了只读(get),只写(set),读写(get和set)三种接口操作。对域的这三种操作,必须在同一个属性名下声明,而不可以将它们分离。

public class MyClass{

    private string _myField;

    public string MyField{

        get{ return _myField; }

        set{ _myField = value; }

    }

}

上例中_myField就是域,MyField就是属性。这里的value是C#的关键字,是我们进行属性操作时的set的隐含参数,也就是我们在执行属性写操作时的赋的值。value和字段使用相同的数据类型。get 和 set 会在相应的时候自动调用 ,主要是为了隐藏程序内的数据结构时用 ,get是获取该属性的值,set设置该属性的值。 

当引用属性时,除非该属性为赋值目标,否则将调用 get 访问器读取该属性的值。程序是如何判别应该调用get还是set的,间接调用get、set方法:对象.属性 = 值(调用set),变量 = 对象.属性(调用get)。

使用set和get的好处

为赋值与取值增加控制;保证属性的安全性,不能直接修改域;便于维护,可实现在set访问器中一处更改。当对操作进行更多控制时,属性的真正作用显现出来,如:

private int myInt;

public int myIntProp{

  get { return myInt;}

  set { if(value >= 0 && value <= 10)  myInt = value; }

}

只用赋给属性的值在1~10之间,才会更改myInt。|#|#|

自动属性(Auto-Implemented Properties)

自动属性C#3.0新语言特性和改进。属性是访问对象状态的首选方式,因为他们禁止外部代码实现对象内部的数据存储机制。属性还对内部数据的访问事件施加了更多的控制,但是,一般以非常标准的方式属性,即通过一个公共属性来访问一个私有成员。其代码非常类似于前面的代码,这是VS重构工具自动生成的。

重构功能肯定加快了键入的速度,C#还为此提供了另一种方式:自动属性。利用自动属性,可以用简化的语法声明属性,C#编译器会自动添加未键入的内容,具体而言,编译器会声明一个用于存储属性的私有字段,并在属性的get和set块中使用该字段,我们无需考虑细节。如:

public int MyIntProp { get; set; }

下面两种代码是等效的:

public class Student

{

    public string Name { get; set; }

}

public class Student

{

    private string name;  // This is the so-called "backing field"

    public string Name  // This is your property

    {

        get {return name;}

        set {name = value;}

}

C#6中可以赋初值:public string text { get;set;} = "自动属性";

自动属性没有给get和set块提供实现的代码。这些块的实现代码(和底层的字段)由编译器提供。自动属性的限制是他们必须包含get和set存储器。如果使用上面的方法来设置属性,则不需要先指定字段。如果要使用自动属性的方式来设置属性表示只读属性,直接省略set访问器即可。只读属性可以写成如下形式:

public int Id{get;}=1;

这里相当于将Id属性的值设置成1,并且要以分号结束。但是,在使用自动生成属性的方法时不能省略 get 访问器,如果不允许其他类访问属性值,则可以在 get 访问器前面加上访问修饰符 private,代码如下:

public int Id{private get; set;}

 

欢迎阅读、分享,转载和使用请注明出处,文章来自三里河之光-风、物、情

 

中华人民共和国