zoukankan      html  css  js  c++  java
  • 属性

    属性可以对设值、取值的过程进行非法值控制,比如除数禁止为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;

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

  • 相关阅读:
    VRChat之blender教程
    29(30).socket网络基础
    26(27).反射及面向对象进阶
    25.python之面向对象
    24.configparser&hashlib
    23.logging
    22.re(正则表达式)
    22.XML
    java日志系统 @Slf4j注解的正确使用
    java四种元注解:@Retention @Target @Document @Inherited)认知
  • 原文地址:https://www.cnblogs.com/assur/p/2232191.html
Copyright © 2011-2022 走看看