属性

属性访问器的由来

  • 变量可以用来描述事物的特征。
    class Hero
    {
      // 金币数量
      public int gold;
    }
    
  • 变量有三个功能:存储数据、读数据、写数据。
    static void Main()
    {
      Hero lk = new Hero();
      lk.gold = 100; // 写数据
      Console.WriteLine(lk.gold); // 读数据
    }
    
  • 实现对读和写的独立访问控制。

    如果变量是public的那么外界即可以读取数据也可以写入数据。如果变量是private的那么外界即不能读取数据也不能写入数据。用访问修饰符对读写的控制总是同步的。如何实现只读或者只写呢?

    class Hero
    {
        // 将变量设为private,这样外界即不能读取变量也不能写入变量。
        // 那么现在这个变量的功能就只剩下了单纯的存储数据。
        private int gold;
    
        // public一个外部能访问的方法。
        // 通过这个方法间接的访问gold变量。
        public int GetGold()
        {
            return gold;
        }
    
        // 提供一个参数让外界间接的给gold变量赋值
        public void SetGold(int value)
        {
            gold = value;
        }
    }
    // 这样我们就将变量的三个功能:存储数据、读数据、写数据,都独立出来了。
    // 如果要实现只能读取变量不能写入变量,把SetGold函数去掉就可以了。
    class Program
    {
        static void Main()
        {
            Hero lk = new Hero();
            // lk.gold = 100; // ERROR:gold是私有的,不能写入。
            lk.SetGold(100); // OK
    
            // Console.WriteLine(lk.gold); // ERROR:gold是私有的,不能读取。
            Console.WriteLine(lk.GetGold()); // OK
        }
    }
    

属性访问器

上例中的中GetGold方法就是读访问器,SetGold方法就是写访问器。 这样就可以对变量gold的读和写进行独立的控制。

  • C#语言提供了一种更简化的语法来实现属性访问器。
  • 属性访问器的使用方式和变量一样。如果是对属性赋值就是调用set访问器,如果是获取属性的值就是调用get访问器。

    class Hero
    {
      private int gold;
    
      // 属性访问器的名字叫Gold与上面的变量gold是完全不同的两个名字。
      // 他们两者之间也没有直接的关系。
      public int Gold
      {
          get // 定义读访问器
          {
              // 这段代码和上例中GetGold的代码一样
              return gold;
          }
          set // 定义写访问器
          {
              // 这段代码和上例中SetGold的代码一样
              // value是一个C#关键字,相当于SetGold的参数。
              gold = value;
          }
      }
    }
    class Program
    {
      static void Main()
      {
          Hero lk = new Hero();
          lk.Gold = 100; // 调用Gold的set访问器,这时会把100赋值给set访问器中的value。
          Console.WriteLine(lk.Gold); // 调用Gold的get访问器。
      }
    }
    
  • 属性访问器的类型说明了,get访问器返回的数据类型,set访问器中value的数据类型。

  • 属性访问器的本质就是函数,仅仅提供了对变量的间接访问,存储数据是由变量完成的。
  • 可以只定义读访问器,也可以只定义写访问器。

    class Hero
    {
      private int gold;
      // 只读的属性访问器
      public int Gold
      {
          get
          {
              return gold;
          }
      }
    }
    
  • 如果只是提供对变量的直接读写操作,可以连变量的申明都简化掉。

    class Hero
    {
      // 可读可写属性
      public int Level { get; set; }
      // 只读属性
      public int Gold { get; private set; }
    }
    
  • 这种方式只是一种简写。数据还是存储在变量中,只是这个变量由编译器偷偷的帮我
  • 们申明。

属性的使用

  • 属性可以用来控制对变量只读、只写或者可读可写的访问。
  • 属性访问器可以用来做一些额外的访问控制。

    class Hero
    {
      public string id;
      public string pwd;
    
      private int gold;
      // 只读属性
      public int Gold 
      { 
          get
          {
              // 读访问控制:只有验证通过了才能访问数据。
              if (id == "likang" && pwd =="password")
                  return gold;
    
              return -1;
          }
          set
          {
              // 写访问控制:确定输入的数据是有效的。
              if (value >= 0)
                  gold = value;
          }
    }
    
  • 属性访问器不一定是要读写某个变量。

    class Example
    {
      private int[] data = {11, 32, 12, 51, 62, 21, 9, 13};
    
      // 获取最小数据
      public int Min
      {
          get
          {
              int min = data[0];
              for(int i = 0; i <data.Length; i++)
              {
                  if (data[i] < min)
                      min = data[i];
              }
              return min;
          }
      }
    }
    

results matching ""

    No results matching ""