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的值。

  • 16
    点赞
  • 39
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值