zoukankan      html  css  js  c++  java
  • 【转载】C# get 与set的一些说明

    转载

    在面向对象编程(OOP)中,是不允许外界直接对类的成员变量直接访问的,既然不能访问,那定义这些成员变量还有什么意义呢?所以C#中就要用set和get方法来访问私有成员变量,它们相当于外界访问对象的一个通道,一个“接口”。先来看一段代码:

    class Employee
      {
            private string name;
            private byte age;
            public string Name
            {
                get { return name; }
                set { name = value; }
            }
            public byte Age
            {
                get { return age; }
                set { age = value; }
            }
      }

      代码中定义了两个私有变量name和age,当我们不想让外界随意访问该私有变量时,可以使用属性来访问,语法为:

    public <返回类型(要与被访问变量的类型相同)> <属性名(不能与被访问变量同名)>
      {
            get{ return <被访问变量>;}
            set{ <被访问变量> = value;}
      }

      当我们使用属性来访问私有成员变量时就会调用里面的get方法,当我们要修改该变量时就会调用set方法,当然在定义的时候可以只定义一个get方法或只定义一个set方法。如果只定义get方法,那么这个相应变量就是“只读”的;如果只定义set方法,那么相应变量就是“只写”的。

      既然外界可以通过set和get访问类内私有成员,那为什么不直接把它定义成共有,直接供外界访问呢?拿上面的Employee类来说明:

    class Employee
        {
            private string name;
            private byte age;
            public string Name
            {
                get { return name; }
                set { name = value; }
            }
            //****修改后****↓↓↓↓↓↓↓↓
            public byte Age
            {
                get { return age; }  
                set
                {                
                    if (value > 10 && value<=100)   //一般在公司雇员的年龄都在10到100岁之间
                    age = value;   
                }
            }
            //****修改后****↑↑↑↑↑↑↑↑
        }

    上例中,set就像一位门卫大叔一样,只有好人才能进来。可以通过属性来控制对员变量的读写,防止对成员变量的非法赋值等。

    再举个小例子,以下是个温度计的类:

    class Thermometer
        {
            private double temperature;
            public Thermometer(double temperature)  //构造函数
            {
                this.temperature = temperature;
            }
            public double Temperature
            {
                get { return temperature; }
                set { temperature = value; }
            }
        }

    假设这里的温度单位表示的是摄氏度(℃),如果在需求分析阶段误解了客户的原始意愿或者客户在日后变更了需求,需要把系统中所有表示温度的变量temperature都用来表示开尔文温度(K)。那么不必动系统中成百上千个Temperature属性,只需在get和set函数中稍微修改一下代码即可:

    class Thermometer
        {
            private double temperature;
            public Thermometer(double temperature)  //构造函数
            {
                this.temperature = temperature;
            }
            public double Temperature
            {
                //****修改后****↓↓↓↓↓↓↓↓
                get { return temperature-273.15; }
                set { temperature = value+273.15; }
                //****修改后****↑↑↑↑↑↑↑↑
            }
        }

    建一个控制台应用程序来测试一下,主函数为:

    class Test
        {
            static void Main(string[] args)
            {
                Thermometer a = new Thermometer(40);
                Console.WriteLine(a.Temperature);
            }
        }

    上面代码中用构造函数给温度设的初值为40度,代码修改前运行结果为“40”,代码修改后运行结果为“-233.15”。

  • 相关阅读:
    [ACM_模拟] ZJUT 1155 爱乐大街的门牌号 (规律 长为n的含k个逆序数的最小字典序)
    [ACM_搜索] ZOJ 1103 || POJ 2415 Hike on a Graph (带条件移动3盘子到同一位置的最少步数 广搜)
    [ACM_动态规划] POJ 1050 To the Max ( 动态规划 二维 最大连续和 最大子矩阵)
    [ACM_搜索] POJ 1096 Space Station Shielding (搜索 + 洪泛算法Flood_Fill)
    [JAVA] java_实例 获得系统字体
    [JAVA] java仿windows 字体设置选项卡
    [JAVA] 一个可以编辑、编译、运行Java简单文件的记事本java实现
    [ACM_模拟] POJ 1094 Sorting It All Out (拓扑排序+Floyd算法 判断关系是否矛盾或统一)
    JS的数组相关知识
    JS的join方法
  • 原文地址:https://www.cnblogs.com/bzpfly/p/9534390.html
Copyright © 2011-2022 走看看