C#|get set

发布时间 2023-03-27 16:36:49作者: Weltㅤ

对于 C# 来说,类里面的属性有专门的 get 和 set 关键字,在给得到某个属性或者给某个属性赋值的时候提供了很多方便,但是,C# 这种机制在无形当中隐藏了一个含义,那就是 get 和 set 变成了一个函数,而用户可以自由地给这些函数添加逻辑,应用举例如下:

有两个person类:

public class person
{
  public string name;
}

public class person
{
  public string Name{set;get;}
}

第一个类型的name属性未封装,其name属性直接通过public关键字暴露给系统中的其他类了,而第二个类型的name属性通过get set关键字进行了封装,get和set分别对应的是可读和可写,相当于如下代码:

private string name;
public string Name
{
    get { return name; }
    set { name = value; }  
}

简单说下区别吧:当实例化第一个“person”类时,系统在分配内存空间时对name属性直接分配内存,之后对name属性的操作也是直接操作内存中name属性所在的这个块;而当实例化第二个“person”类时,系统会先分配一个叫name的private私有的内存空间(此处的name对于类的内部使用,Name对于外部操作使用),之后的读与写的操作都是通过Name这个public的类似于指针的变量来关联name进行,以此达到封装的目的,并且通过get和set关键字也可以控制可读还是可写。

属性在调用者看来就像一个普通的变量,但作为类的设计者,可以利用属性来隐藏你类中的一些字段,使外界只能通过属性来访问你的字段,你可以通过属性来限制外界对你的字段的存取,就利用get、set。如果想让用户随意存取你的字段,那么就实现get、set;如果只想让用户读取字段,就只实现get;若只想让用户写字段就只实现set。

至于get和set的作用,除了控制读写之外还有其他的作用,举个简单的例子,比如说当我给Name赋值的时候想要先进行一些逻辑判断,就可以这样:

private string name;
public string Name
{
    get { return name; }
    set
    {
        name = String.IsNullOrEmpty(value) ? " " : value;
    }
}

同时还可以在set和get中对用户传递的值进行一些验证工作,以确保你的字段将含有正确的值。

private int a;
Public int index
{
  get
  {
    return a;
  }
  set
  {
     If (value>0)
       a=value;
     else a=0;
  }
}

可看出,get、set用法中:

一是隐藏组件或类内部的真实成员;

二是用来建立约束的,比如,实现“有我没你”这种约束;

三是用来响应属性变化事件,当属性变化是做某事,只要写在set方法里就行。

当你想读出或写入属性的值时,存取标志限定了被实现的语句。用于读出属性的值的存取标志记为关键字get,而要修改属性的值的读写符标志记为set。