【学习资料】

  《C#图解教程》(第6章):https://www.cnblogs.com/moonache/p/7687551.html
  电子书下载:https://pan.baidu.com/s/1mhOmBG0

【内容】

    • 属性(Property)

      • 使用属性的原因
      • 访问器:set / get
      • 限制权限:只读 / 只写
      • 自动实现属性
      • 抽象属性
    • 索引器(Indexer)
      • 定义
      • 索引器的重载

【属性Property】

  • 使用属性的原因

    • 隐藏 类外部对类的某 成员数据(_age) 进行 直接操作,将_age设置为私有成员数据  private int _age = ;
    • set/get访问器中赋值或获取值时,可以加入其他代码逻辑(如数值范围大小限制)
    • 对类外部只开放 只读只写 权限
    • class Person
      {
      private int _age = ; // 字段:分配内存
      public int Age // 属性:不分配内存
      {
      get { return _age; }
      set { _age = value; }
      }
      }
  • 属性是一个特殊的成员函数,包含了:set 和 get 访问器

    • 属性不分配内存
    • set访问器
      • 拥有一个单独的、隐式的值参,名称为 value,与属性的类型相同
      • 拥有一个返回类型void
    • get访问器
      • 没有参数
      • 拥有一个与属性类型相同的返回类型
    • 例如:定义一个Age属性
    • class Person
      {
      private int _age = ; // 字段:分配内存
      public int Age // 属性:不分配内存
      {
      get // get访问器, 要有return
      {
      return _age;
      }
      set // set访问器, 包含隐藏参数value
      {
      if (value < ) // 访问器里可以对value进行校验
      {
      _age = ;
      Debug.Log("年龄输入有误");
      }
      else
      _age = value;
      }
      }
      }
      void Start()
      {
      Person person = new Person();
      person.Age = ;
      Debug.Log(person.Age);
      }
  • 属性的访问权限(只读、只写)

    • 属性可以只有set或get访问器:属性只读或只写

      • 只有set访问器:只写属性,此时  Debug.Log(person.Age);  就无法访问了;
      • class Person
        {
        private int _age = ; // 字段:分配内存
        public int Age // 属性:不分配内存
        {set // set访问器, 包含隐藏参数value
        {
        if (value < ) // 访问器里可以对value进行校验
        {
        _age = ;
        Debug.Log("年龄输入有误");
        }
        else
        _age = value;
        }
        }
        }
      • 只有get访问器:只读属性,此时 person.Age = ;  就无法设置了;
      • class Person
        {
        private int _age = ; // 字段:分配内存
        public int Age // 属性:不分配内存
        {
        get // get访问器, 要有return
        {
        return _age;
        }
        }
        }
    • 属性的set和get可以加访问修饰符: private  protected   internal 

      • class Person
        {
        private int _age = ; // 字段:分配内存
        public int Age // 属性:不分配内存
        {
        get // get访问器, 要有return
        {
        return _age;
        }
        private set // 定义成私有set访问器, 只有类内部可以访问
        {
        if (value < ) // 访问器里可以对value进行校验
        {
        _age = ;
        Debug.Log("年龄输入有误");
        }
        else
        _age = value;
        }
        }
        // 私有属性set访问器,类内部可访问
        public void UpdateAge(int age)
        {
        Age = age;
        }
        }
        void Start()
        {
        Person person = new Person();
        //person.Age = 18; // 报错,私有属性set访问器,外部无法访问
        Debug.Log(person.Age);
        }
  • 自动实现属性

    • 只声明set和get,编译器会自动创建隐藏的数据
    • class Person
      {
      public int Age // 属性:分配内存(会自动创建隐藏数据)
      {
      get;
      private set;
      }
      }
  • 抽象属性

    • 属性也可以定义为抽象属性(与抽象函数类似)
    • public abstract class Person
      {
      public abstract int Age // 抽象属性,与抽象函数类似
      {
      get;
      set;
      }
      }
      class Student : Person
      {
      public override int Age // 子类实现
      {
      get;
      set;
      }
      }
      void Start()
      {
      Person student = new Student();
      student.Age = ;
      Debug.Log(student.Age);
      }

【索引器Indexer】

  •  定义

    • 与 属性 功能基本相似,也是用set和get访问器实现,但是通过 类似数组下标[index] 的方式进行访问,相当于一个 虚拟数组
    • 和属性一样,索引器也不用分配内存来存储
    • return-type this[int index]
      {
      // get 访问器
      get
      {
      // 返回 index 指定的值
      }
      // set 访问器
      set
      {
      // 设置 index 指定的值
      }
      }
  • 例子:内部定义数组  private string[] namelist ,然后通过索引器访问

    • class IndexedNames
      {
      static public int size = ;
      private string[] namelist = new string[size]; // 定义索引器,下标类型为[int]
      public string this[int index]
      {
      get
      {
      if (index >= && index < size)
      {
      return namelist[index];
      }
      else
      {
      Debug.Log("index超出范围");
      return "";
      }
      }
      set
      {
      if (index >= && index < size)
      {
      namelist[index] = value;
      }
      }
      }
      }
      void Start()
      {
      IndexedNames names = new IndexedNames();
      names[] = "Zara"; // 索引器[0]
      names[] = "Riz"; // 索引器[1]
      }
  •  索引器重载

    • 可以是不同的类型,也可以有多个参数
    • int类型: public string this[int index] 
    • string类型: public int this[string name] 
    • 多参数类型: public string this[int index1, int index2] 
      • 访问方式:names[index1, index2]
      • 注:names[index1][index2] 相当于执行 [int index]  获取到nameList[index1],然后读取string的第index2的字符
    • class IndexedNames
      {
      static public int size = ;
      private string[] namelist = new string[size];
      //
      public string this[int index]
      {
      get
      {
      if (index >= && index < size)
      {
      return namelist[index];
      }
      else
      {
      Debug.Log("index超出范围");
      return "";
      }
      }
      set
      {
      if (index >= && index < size)
      {
      namelist[index] = value;
      }
      }
      }
      // 多参数[index1, index2]: 例如index2表示获取子串长度
      // 访问方式names[index1, index2],而不是names[index1][index2]
      public string this[int index1, int index2]
      {
      get
      {
      return namelist[index1].Substring(, index2);
      }
      }
      // [string] 获取name对应的下标index
      public int this[string name]
      {
      get
      {
      int index = -;
      for (int i = ; i < namelist.Length; ++i)
      {
      if (namelist[i] == name)
      {
      index = i;
      break;
      }
      }
      return index;
      }
      }
      }
      void Start()
      {
      IndexedNames names = new IndexedNames();
      names[] = "Alice"; // 索引器[0]
      names[] = "Bob"; // 索引器[1]
      names[] = "Cherry"; // 索引器[2]
      Debug.Log(names[]); // 输出:Alice
      Debug.Log(names["Bob"]);// 输出:1
      Debug.Log(names[, ]); // 输出:Che
      Debug.Log(names[][]); // 输出:r
      }

【Unity|C#】基础篇(7)——属性(Property)/ 索引器(Indexer)的更多相关文章

  1. python基础知识(属性property)

    属性property property               !=          类属性和实例属性 访问计算后所得的值           返回所存储的值 创建用于计算的属性 @proper ...

  2. C#中方法,属性与索引器

    C#中方法,属性与索引器: TODO: 1,关于系统中常常出现的通过某一字段,查询相应实体信息(可能是一条字段或一条数据和一组泛型集合) 解说篇:1,方法,2,属性3.索引器 1.方法(1.依据状态编 ...

  3. (转)c# 属性与索引器

    属性是一种成员,它提供灵活的机制来读取.写入或计算私有字段的值. 属性可用作公共数据成员,但它们实际上是称为“访问器”的特殊方法. 这使得可以轻松访问数据,还有助于提高方法的安全性和灵活性. 一个简单 ...

  4. iOS开发基础篇-transform属性

    一. transform 属性 在OC中,通过 transform 属性可以修改对象的平移.缩放比例和旋转角度. 1)创建“基于控件初始位置”的形变  CGAffineTransformMakeRot ...

  5. CSharp初级篇 1-4 this、索引器、静态、常量以及只读

    .NET Core CSharp初级篇 1-4 本节内容为this.索引器.静态.常量以及只读 简介 在之前的课程中,我们谈论过了静态函数和字段的一小部分知识,本节内容中,我们将详细的讲解关于对象操作 ...

  6. C#基础回顾(三)—索引器、委托、反射

    一.前言                                                                                       ------人生路 ...

  7. set,get方法(属性,索引器)

    很多时候我们不可以把一些字段暴露出来允许别人调用和修改,为了隐藏这些字段又便于加限制的使用,在面向对象编程中一般采用写get set函数的办法,比如: //字段_age, "_"表 ...

  8. C#中索引器Indexer的学习使用

    索引器 顾名思义,是用来索引的,那么C#中索引器是用来索引什么的呢 首先我们知道,C#中的数组是本身就可以索引的,那么C#中的类和结构呢,类和结构的实例是无法索引的,如果我们想让C#中类或者结构的实例 ...

  9. C#.NET常见问题(FAQ)-索引器indexer有什么用

    索引器就是名值对,你声明一个名值对的类,就可以给数组的指定元素赋值,也可以很方面的访问到指定元素值对应的下标(个人认为完全可以自己写一个类似的list来实现,没有必要多此一举学一个额外的方法)   复 ...

随机推荐

  1. Html介绍,了解html代码的注释

    什么是代码注释?在代码编辑器中的注释代码是不会在浏览器窗口展示的!html代码注释的作用是帮助程序员标注代码的用途,过一段时间后再看你之前编写的代码,很快可以想起这个代码的用途.代码注释不仅方便程序员 ...

  2. springboot容器加载完毕执行某一个方法

    问题: 最近做项目(项目使用的是springboot)的时候,数据库有一个配置参数表,每次都要查询数据库去做数据转换,这样每次查询数据库感觉不太友好,后来写了一个方法项目启动完成后立即执行此方法,将配 ...

  3. 应用场景不同,是无代码和低代码的最大区别 ZT

    随着媒体对低代码.无代码等先进技术的持续关注,我们发现大多数人都听说过低代码开发和无代码开发这两个概念,但是对两者之间的区别其实并不清楚.事实上,低代码开发和无代码开发之间存在着很多非常显著的差异,如 ...

  4. SQL server 游标用法

    declare @EmpCode varchar(50), @EmpName varchar(50), @EmpAddress varchar(200);declare curEmployee cur ...

  5. javaSE学习笔记(15) ---缓冲流、转换流、序列化流

    javaSE学习笔记(15) ---缓冲流.转换流.序列化流 缓冲流 昨天复习了基本的一些流,作为IO流的入门,今天我们要见识一些更强大的流.比如能够高效读写的缓冲流,能够转换编码的转换流,能够持久化 ...

  6. shiro权限认证Realm的四大用法

    一.SimpleAccountRealm public class AuthenticationTest {          SimpleAccountRealm sar=new SimpleAcc ...

  7. LeetCode 145. 二叉树的后序遍历 (用栈实现后序遍历二叉树的非递归算法)

    题目链接:https://leetcode-cn.com/problems/binary-tree-postorder-traversal/ 给定一个二叉树,返回它的 后序 遍历. 示例: 输入: [ ...

  8. Windows电脑最最最常用快捷键

                            快捷键组合                    作用 Ctrl+A 全选 Ctrl+S 保存 Ctrl+Z 撤销 Ctrl+X 剪切 Ctrl+C 复 ...

  9. Java设计模式(一)UML总结

    定义 统一建模语言(英语: Unified Modeling Language ,缩写UML)是非专利的第三代建模和规约语言. UML特点 UML是一种开放的方法 用于说明.可视化.构建和编写一个正在 ...

  10. 2020.02.01【NOIP提高组】模拟B 组总结反思——数列(sequence) 树 【2012东莞市选】时间流逝 挖掘机技术哪家强

    T1 数列(sequence) 比赛时 我自以为是地打了简简单单一个判断--- 之后 Waiting-- T2 2753. 树(tree) 比赛时 这题我居然比赛时也想了很久,可能是因为我太懒,我很早 ...