• C# 中字段和属性的使用时机


        在C#中,我们可以非常自由的、毫无限制的访问公有字段,但在一些场合中,我们可能希望限制只能给字段赋于某个范围的值、或是要求字段只能读或只能写,或是在改变字段时能改变对象的其他一些状态,这些单靠字段是无法做到的,于是就有了属性,属性中包含两个块:set和get,set块负责属性的写入工作,get块负责属性的读取工作。在两个块中都可以做一些其他操作,如在set中验证赋的值是否符合要求并决定是否进行赋值。当缺少其中一块时属性就只能读或只能写,set和get块中属性必需有一个,因为即不能读又不能写的属性是没有意义的。

     1 class MyClass
     3 {
     5      Private  string  name;
     7      public string Name
     9      {
    11       get {return Name;}
    13       set {Name=value;}
    15      }
    17 }

    (1)属性可以保证安全,当不在本类中使用时可以保证使用属性名可以避免

    用字段的名字。

    (2)属性的set和get函数可以限制字段的一些功能,以达到某种目的。

    如:

    private int a=0;
     
    public int A
    {
         get{return this.a;}
         set
         {
             if(value >= 0 && value <= 100)
                  this.a=value;
             else
                  throw new Exception("值的范围不合法。");
         }
    }
    (3)属性没有存储数据的功能,数据都存在字段中,所以只有修改字段的数据才能更改数据,修改属性的值没用。
     
    总结:
      1. 字段用来保存数据的,设置private,protected, public可以控制访问范围,只能单纯读取值, 不能做赋值的验证条件, 不能设置读写控制, 不能间接改变其他值
          2. 属性在IL中可以看出就是一个方法, 数据保存还是在字段中, 通过set, get 可以做字段不能做的上述很多操作
          3. 用字段来保存数据, 设置到读写控制的时候就用属性,但是又会觉得每次都写一个字段加一个属性太麻烦,就可以用下面的书写方式,既简介又可以一眼看出是属性
     1     public class Genre
     2     {
     3         public string Name { get; set; }
     4     }
     5     // 编译器会编译成以下方式
     6     public class Genre
     7     {
    10         private string name;
    11         public string Name
    12         {
    13             get
    14             {
    15                 return this.name;
    16             }
    17             set
    18             {
    19                 this.name = value;
    20             }
    21         }
    22     }
     
  • 相关阅读:
    jmeter如何操作数据库
    jmeter压力测试
    cmd中用ping命令时,提示ping命令不是外部或内部命令问题
    scrapy post Request payload类型值
    scrapy-deltafetch实现增量爬取
    django虚拟环境搭建笔记
    python Image模块基本语法
    登录北京住房公积金,使用已注册过账号
    登录北京社保网站
    python通过pop3方式登录邮箱(qq,新浪,网易)
  • 原文地址:https://www.cnblogs.com/ZengYunChun/p/6136555.html
Copyright © 2020-2023  润新知