C#——set和get

简介: 在面向对象编程(OOP)中,要求把是不允许外界直接对类的成员变量直接访问的,既然不能访问,那定义这些成员变量还有什么意义呢?所以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度,因此代码修改前运行结果为:


21.png

        代码修改后运行结果为:

22.png

        如有不足与纰漏,恳请您留下宝贵意见与建议,感激不尽!



相关文章
|
6月前
|
缓存 监控 Java
ThreadLocal 源码解析get(),set(), remove()用不好容易内存泄漏
ThreadLocal 源码解析get(),set(), remove()用不好容易内存泄漏
82 1
|
6月前
|
网络协议 API C#
C# 中模拟 POST 和 GET 请求的原理与实践
【1月更文挑战第4天】在现代网络应用中,HTTP请求是客户端与服务器交互的基础。其中,GET和POST是最常用的两种请求方法。本文将介绍如何使用C#语言模拟这两种请求,并解释其背后的工作原理。我们将利用.NET框架中的HttpClient类来发送请求,并处理服务器的响应。通过本文,读者将能够理解HTTP请求的基本构成,学会在C#中编写代码来模拟这些请求,进而在开发过程中实现与Web服务的交互。
|
6月前
idea快速生成get set 构造方法的快捷键
idea快速生成get set 构造方法的快捷键
203 0
|
6月前
|
存储 NoSQL Ubuntu
在Ubuntu上安装Redis并学习使用get、set和keys命令
在Ubuntu上安装Redis并学习使用get、set和keys命令
|
9天前
|
Java Windows
IDEA不使用lombok,如何快速生成get和set方法
【11月更文挑战第10天】在 IntelliJ IDEA 中生成 `get` 和 `set` 方法有多种方式:通过菜单操作、使用快捷键或自定义模板。菜单操作包括选择“Code”菜单中的“Generate...”,快捷键为“Alt + Insert”。自定义模板可在“File”-&gt;“Settings”-&gt;“Editor”-&gt;“Code Style”-&gt;“Java”中设置。批量生成时,可多选变量一次性生成。
idea按住alt + insert 没有出现get和set方法怎样解决
idea按住alt + insert 没有出现get和set方法怎样解决
|
1月前
|
C#
SET访问器和GET访问器
SET访问器和GET访问器
27 2
|
3月前
|
API
【Azure Key Vault】.NET 代码如何访问中国区的Key Vault中的机密信息(Get/Set Secret)
【Azure Key Vault】.NET 代码如何访问中国区的Key Vault中的机密信息(Get/Set Secret)
|
3月前
|
Java Linux 开发者
|
3月前
|
缓存 NoSQL Redis
【Azure Redis 缓存】Azure Cache for Redis 是否记录具体读/写(Get/Set)或删除(Del)了哪些key呢?
【Azure Redis 缓存】Azure Cache for Redis 是否记录具体读/写(Get/Set)或删除(Del)了哪些key呢?