set()与get()详细解答(C#)

这几天在搬砖时候用到了set()与get(),同事问了我一些问题,我打算在博客中总结一下。
觉得帮助到了您,帮我点个赞哦。

属性访问器

其实说白了就是操作一个属性,更通俗一点说就是对一个变量的取值与赋值。

先来看get()

get 访问器必须在 return 或 throw 语句中终止,并且控制不能超出访问器体。

private int a;   // 私有的变量
public int A  // 公有变量,这个变量作用就是得到私有变量的值
{get {return a; //这里的return就是上边说的必须在 return 或 throw 语句中终止}
}

现在还是不懂对吧,这个变量怎么还能加{ }里边写语句呢。嘿嘿就是这么神奇,就是这么规定的。
当你改变a的值,A的值也会变。
假如你在主函数当中有这么个操作:

a=5;

你会发现运行完a=5以后A也变成了5。

当你使用这个公有变量A当做右值给其他变量赋值的时候,他就会执行{ }里边的语句。
假如你在主函数当中有这么个操作:

int B=A;

这个时候并不是把A的值直接给B,而是先执行A里边的get(),把a的值返回给A,再将A的值传递给B;
这时候相当于

int B=0;
A=a;
B=A;

只带有 get 访问器的属性称为只读属性。无法对只读属性赋值。
假如你在主函数当中有这么个操作:

int B=2;
A=B;

这个时候直接把B的值给A,但是编译器报错,提示A是只读的;

当引用属性时,除非该属性为赋值目标,否则将调用 get 访问器读取该属性的值。
白话解释一下,当变量定义时使用get,那么变量在作为右值给其他变量赋值或者当做函数参数值时候,会先运行get里边的语句。当做为左值被赋值时候则报错。
现在总结一下:
1.get就是返回一个值或者说属性;
2.在定义时使用get的变量在使用作为右值先执行get里边的语句返回给变量再去使用
3.在定义时使用get的变量在使用作为左值报错
不能光说不练啊,接下来写个控制台程序来验证一下。
先来源码

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;namespace ConsoleApplication1
{class Program{static private int a = 3;static public int A{get { return a; }}static void Main(string[] args){int B=0;a = 5;A = 22;B = A;}}
}

这个时候编译一下,报错了:
错误 1 无法对属性或索引器“ConsoleApplication1.Program.A”赋值 – 它是只读的
在这里插入图片描述
接下来就把这句话屏蔽掉,编译运行打断点。
在这里插入图片描述
在给a赋值时候,在使用A时候打个断点,在A的get里边打个断点。
运行一下看一下
先运行到:a = 5;这个时候A与a都还为3;
在这里插入图片描述
按F10单步再接着往下边运行
我们惊奇的发现Aa同时变成了5
在这里插入图片描述
按F10单步再接着往下边运行,就会进入get
在这里插入图片描述
按F10单步再接着往下边运行,才到A给B赋值。
在这里插入图片描述
好啦,get我们讲完啦。接下来是set

再来看set()

set 访问器与返回 void 的方法类似。它使用称为 value 的隐式参数,此参数的类型是属性的类型。

private int a;
public int A 
{set {a = value; }
}

当你改变A的值,a的值也会变。
假如你在主函数当中有这么个操作:

A=5;

你会发现运行完A=5以后a也变成了5。

当你使用这个公有变量A当做左值被其他变量赋值的时候,他就会执行{ }里边的语句。
假如你在主函数当中有这么个操作:

int B=3;
A = B;

这个时候并不是只把B的值给A,还会将A的值赋值给a;
这时候相当于

int B=3;
A=B;
a=A;

只带有 set 访问器的属性称为只写属性。只写属性除作为赋值的目标外,无法对其进行引用。
假如你在主函数当中有这么个操作:

int B=2;
A=B;

这个时候直接把A的值给B,但是编译器报错,提示A是只写的;

现在总结一下:
1.set改变A变量时候a的值也会改。
2.只有set属性的变量是只读的。

不能光说不练啊,接下来写个控制台程序来验证一下。
先来源码

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;namespace ConsoleApplication1
{class Program{static private int a = 3;static public int A{set { a = value; }}static void Main(string[] args){int B = 0;A = 22;B = A;}}
}

这个时候编译一下,报错了:
错误 1 无法对属性或索引器“ConsoleApplication1.Program.A”赋值 – 它是只读的
在这里插入图片描述
接下来就把这句话屏蔽掉,编译运行打断点。
在这里插入图片描述
我们在给A赋值时打断点,再在set处打断点。
运行一下看一下
先运行到:a = 3;这个时候A里边还是空的,这是因为A是只写的没办法读出来他的数值;
在这里插入图片描述
按F10单步再接着往下边运行,直接先到set中,a的值变成了22。神奇吧
在这里插入图片描述
按F10单步再接着往下边运行,程序结束。
在这里插入图片描述
好啦,get、set我们讲完啦。接下来是结合在一块。

再来看set()get()

同时带有 get 和 set 访问器的属性为读写属性。

private int a;   // 私有的变量
public int A  // 公有变量,这个变量作用就是得到私有变量的值
{get {return a; }set {a = value; }
}

经过上述讲解,我们直接来看代码,编译调试看一下。源代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;namespace ConsoleApplication1
{class Program{static private int a = 33;static public int A{get { return a; }set { a = value; }}static void Main(string[] args){int B;B = A;a = 55;}}
}

这个代码自己编译调试一下吧,自己建一个工程,直接复制过去就好了。

总结:

1、A4与a4的值,总是相等。

2、若要修改a4,则需要通过A4修改即可。a4的往往通过设置外部属性A4值的方式,然后在A4属性内设置一些条件,来更新a4。

3、Value的值,总是等于外部属性A4的值。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/254717.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

IM应用中如何计算富文本的高度

背景 在开发IM的项目过程中,经常会有出现一些需要计算DOM高度,然后超出若干行隐藏等需求。很多时候,需要计算高度的DOM元素都是动态生成的,我们无法在数据渲染前获取到它的高度。 如果没有任何交互,我们可以通过CSS来实…

G代码 机器人的CNC实现

  控制铣削工作台和工件的NC程序,通过CAD软件创建,这些NC程序与特定的机器类型相关。 NC程序在笛卡尔坐标系中动作的描述,对于需要确保一个明确的变换轴位置的关节型的机器人来说,缺少附加的状态和旋转信息。传…

IScroll5中文API整理,用法与参考

IScroll是移动页面上被使用的一款仿系统滚动插件。IScroll5相对于之前的IScroll4改进了许多,使得大家可以更方便的定制所需的功能了。 做项目的时候正好用到了这个插件,自己做了一下总结,发在这里方便大家学习IScroll5。 官网:htt…

Linux 安装USB摄像头

sudo apt-get updatesudo apt-get install fswebcamsudo apt-get install mplayersudo apt-get install alsamixer安装完毕ls /dev查找设备是否有video0这个设备sudo mplayer tv:// 可以看到摄像内容转载于:https://www.cnblogs.com/smartkeke/p/6820426.html

struct x264_t 维护着CODEC的诸多重要信息

//x264_t结构体维护着CODEC的诸多重要信息struct x264_t{/* encoder parameters ( 编码器参数 )*/x264_param_t param;x264_t *thread[X264_SLICE_MAX];/* bitstream output ( 字节流输出 ) */struct{int i_nal;x264_nal_t nal[X264_NAL_MAX];int i_bitstr…

如何判断一条曲线是否自己相交?

今天看到群里有人在问这个问题,想了一个解决办法。 我们首先作假设,如果一条曲线有交点,那么它就是相交的对吧。可能大家想的都是这样,就开始找各种方法去识别交点。 我们换个角度想一下:是不是我们判断这条曲线是否带…

XML 与网络的数据传输

XML 与网络的数据传输

hdu 5813 Elegant Construction

水题 题意:有n个城市,给你每个城市能到达城市的数量,要你构图,输出有向边,要求无环,输出任意的解 例: Sample Input 332 1 021 143 1 1 0Sample OutputCase #1: Yes21 22 3Case #2: NoCase #3: …

Redis实战笔记

Redis 数据库 一、 概要 1. 特点 用于抽象数据类型的 DSL内存存储基础数据结构 API编码风格避免代码复杂两层 API以优化为乐2. 数据类型 键值对(字符串->字符串)哈希列表(链表)集合:差并交有序集合 列表 集合位图…

内存申请与一级二级指针

1.如果是函数内进行内存申请,很简单,标准用法就可以了: test(){int *array;array(int *)malloc(sizeof(int)*10);//申请10*4 bytes,即10个单位的int内存单元}注意,malloc使用简单,但是注意参数和返回值&…

halcon相机标定及图像矫正(代码)

侵删 1 halcon相机标定和图像矫正 对于相机采集的图片,会由于相机本身和透镜的影响产生形变,通常需要对相机进行标定,获取相机的内参或内外参,然后矫正其畸变。相机畸变主要分为径向畸变和切向畸变,其中径向畸变是由透…

找寻一个邮箱

import java.util.Scanner; import java.util.regex.Matcher; import java.util.regex.Pattern;public class zhengze {public static void main(String[] args) { //1.创建一个正则表达式对象Pattern pPattern.compile("[0-9]{6}"); //2.获得匹配器 String s…

先弄个XML解析器代码抄一抄 慢慢研究 O(∩_∩)O哈哈~

出处:http://bbs.csdn.net/topics/390229172 已经自我放逐好几年了.打算去上班得了.在最后的自由日子里,做点有意义的事吧... 先来下载地址 http://www.kuaipan.cn/file/id_12470514853353274.htm 已经在很多正式,非正式的场合…

紫书 例题8-10 UVa 714 (二分答案)

这道题让最大值最小, 显然是二分答案当题目求的是最大值最小, 最小值最大, 这个时候就要想到二分答案为什么可以二分答案呢, 因为这个时候解是单调性的, 如果简单粗暴一点就全部枚举一遍, 验证答案。但是因…

was not declared in this scope

“was not declared in this scope”是一个错误信息,在编译的时候会遇到。其含义为标识符在其出现的地方是未被定义的。 出现该错误的时候,会同时把未定义的变量名显示出来。比如如下程序: int main(){ printf("%d",i);//这个i是…

函数参数的传递问题(一级指针和二级指针)

函数参数的传递问题(一级指针和二级指针) [转]原以为自己对指针掌握了,却还是对这个问题不太明白。请教! 程序1: void myMalloc(char *s) //我想在函数中分配内存,再返回 { s(char *) malloc(100); } void …

Win7下使用U盘安装linux Ubuntu16.04双系统图文教程

Win7下使用U盘安装linux Ubuntu16.04双系统图文教程 Ubuntu(友帮拓、优般图、乌班图)是一个以桌面应用为主的开源GNU/Linux操作系统,Ubuntu 是基于DebianGNU/Linux,支持x86、amd64(即x64)和ppc架构&#xf…

SynchronizationContext

SendOrPostCallback xxx vg > { Text "内部: "vg.ToString(); };dynamic vx new { a SynchronizationContext.Current, b xxx };Thread td new Thread(x >{dynamic tmp x;// SynchronizationContext ds x as SynchronizationContext;for (in…

CoDeSys的前世今生

工作以及网上看到不少人说,CoDeSys和西门子step7,在德国都属于标准过程,牛逼的小朋友都可以用其编程,不知真假,相信无风不起浪,多少有些依据,看看国內清一色的日系编程…

UVALive 7324 ASCII Addition (模拟)

ASCII Addition题目链接: http://acm.hust.edu.cn/vjudge/contest/127407#problem/A Description Nowadays, there are smartphone applications that instantly translate text and even solve math problems if you just point your phone’s camera at them. You…