//加载形式

get与set属性

就直接分析程序吧,如下有三段程序,三个程序都是在某一个类中:

//程序1
public string name;

//程序2
public string name{get;set;}

//程序3
private string name;
public string Name;
{
    set{name = value;}
    get{return name;}
}
  • 程序1

这个比较简单易懂,直接就是类中的一个共有的数据成员。可以直接通过类的对象进行初始化后,然后进行调用。

  • 程序2

第一眼看的时候会比较蒙,get与set的作用是啥,这是个什么用法。我都有点怀疑自己了,当遇到这个的时候。不过一番了解后,就知道了。简单点说,如下:

  • 程序2与程序1在使用的作用是一样的。其中的get与set是name数据成员的两个属性

为什么,第一个没有呢?

  1. 第一个类型的name属性未封装,其name属性直接通过public关键字暴露给系统中的其他类
  2. 第二个类型的name属性通过get set关键字进行了封装,get和set分别对应的是可读和可写

也就是说,每个数据成员都是具有get与set属性的。在默认没有显示的设置的时候,默认就是个可读与可写的。而程序2的写法就对其进行了显示的表达,两者在使用上没有区别。

但是如果将程序2,进行一个小的修改:

//程序2-修改1
public string name{get;}
//程序2-修改2
public string name{set;}

修改后,name数据成员将与程序1中的name有所区别。

  • 修改1:name只能可读,将不能修改其值。
  • 修改2:name的属性就是只能进行写入

再来说说程序3的作用

//程序3
private string name;
public string Name
{
    set{name = value;}
    get{return name;}
}
  • 私有数据成员是name,而Name是一个属性。对name数据成员进行保护的

可能有疑问的是,value没有进行定义,为什么可以直接进行使用呢?

  • 在用set时有一个特殊的变量value 就是设置属性时的值
  • value 隐式参数,用于设置访问器以及添加或移除事件处理程序。

这样一来问题就解决了。这三个程序之间的区别也就区分开来了。在实际的使用中,应该对数据成员都会有一个相应的属性。一方面是对数据成员的保护,而另一方面可以进行数据成员的取值与赋值进行限制。用一个小案列来说明一下,如下:

// 年龄一般来讲都是在0到一百之间
//防止出现小于0 或大于100 进行限制一下
private int age;
public int Age
{
    get{return age;}
    set{
      //value 是set的隐式参数
      //set值也就是对value值进行设置
     if(value<0 || value>100)
     {
         //超出范围的值 进行归零
         value = 0;
     }
     // 在范围内 进行值的设置
        age = value;
    }   
    }
}

以上的程序就对age数据成员进行保护的同时对age值的设置也进行了一个限定。

程序看起来都挺简单的,但是在实际的使用中,作用还是挺大的。

Did you git it?

posted @ 2020-12-11 21:36  Serendipitychen  阅读(682)  评论(0编辑  收藏  举报