zoukankan      html  css  js  c++  java
  • C#中的set和get方法

      在面向对象编程(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”。

    文章转载自:http://blog.csdn.net/u013095889/article/details/52804360

    在通往幸福道路上,并没有什么捷径可走,唯有付出努力和拼搏
  • 相关阅读:
    JavaScript HTML DOM
    Java数组声明、初始化
    如何破解MyEclipse 10.x
    SpringBoot框架中解决日期展示问题
    spring boot集成mybatis-plus插件进行自定义sql方法开发时报nested exception is org.apache.ibatis.binding.BindingException: Invalid bound statement (not found):
    Spring boot启动时报 java.sql.SQLException: java.lang.ClassCastException: java.math.BigInteger cannot be cast to java.lang.Long错误
    springboot 配置mybatis打印sql
    解决使用Navicat等工具进行连接登录mysql的1130错误,无法使用Ip远程连接的问题(mysql为8.0版本)
    解决使用Navicat等工具进行连接登录mysql的1521错误,(mysql为8.0版本)
    【转载】VUE的背景图引入
  • 原文地址:https://www.cnblogs.com/xinhuawei/p/15690980.html
Copyright © 2011-2022 走看看