• 属性


    属性可以对设值、取值的过程进行非法值控制,比如除数禁止为0,而字段则不能进行这样的设置。虽然一般情况下get读取的值就是set设置的值,但也有极端的例子

    Eg1:(让get读取的值不是set设置的值)

     1     class Program
    2 {
    3 static void Main(string[] args)
    4 {
    5 Person p = new Person();
    6 p.Age = 25;
    7 p.Age++;
    8 Console.WriteLine(p.Age);//输出为10
    9

    10 Console.ReadKey();
    11 }
    12
    13 }
    14 class Person
    15 {
    16 public int Age
    17 {
    18 get
    19 {
    20 return 10;
    21 }
    22 set
    23 {
    24
    25 }
    26 }
    27 }

    Eg2:进行非法值控制

     1         class Person
    2 {
    3 private string job;
    4 public string Job
    5 {
    6 get
    7 {
    8 return job;
    9 }
    10 set
    11 {
    12 if (value == "Waiter")
    13 {
    14 this.job = "工资太少,不干!";
    15 return;
    16 }
    17 this.job = value; ;
    18 }
    19 }
    20 }

    Eg3:

    1 public int Age
    2 {
    3 get;
    4 set;
    5 }

    若用Reflector反编译 Eg3 可以看出其属性内部就是两个方法:

     1 [CompilerGenerated]
    2 public void set_Age(int value)
    3 {
    4 this.<Age>k__BackingField = value;
    5 }
    6
    7 public int get_Age()
    8 {
    9 return this.<Age>k__BackingField;
    10 }

    这就是编译器玩的技巧,.NET中的“语法糖”(非官方定义),当程序员简单的get、set的时候编译器自动帮程序员生成私有字段:

    private int <Age>k__BackingField;

    并且帮我们完成这两个方法,微软真是太伟大啊!(泪流满面)而且
    其声明的属性名很有意思微软凭借其编译器的内部优势生成了一个看似违反微软自己语法的属性名

    <Age>k__BackingField;

    我们知道一般声明字段用"_"或者字母开头,但微软的编译器有这个特权改字段的名字,真是“只许州官放火不许百姓点灯”,无非是让程序员用起来更方便。

  • 相关阅读:
    DEBUG_PRINT
    FFMpeg的解码流程
    解决Cannot open the disk 'E:\my Ubuntu\Ubuntu000001.vmdk' or one of the snapshot disks it depends on.(虚拟机突然断电之后)
    关于mov.c的demuxer
    dts
    fprintf
    H264学习(1)
    如何安装不能识别的驱动错误代码为10
    mplayer先播视频后播音频的解决方法
    团队作业(二) IS191x
  • 原文地址:https://www.cnblogs.com/assur/p/2232191.html
Copyright © 2020-2023  润新知