这几天在搬砖时候用到了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的值。