【Unity|C#】基础篇(7)——属性(Property)/ 索引器(Indexer)
【学习资料】
  《C#图解教程》(第6章):https://www.cnblogs.com/moonache/p/7687551.html
	  电子书下载:https://pan.baidu.com/s/1mhOmBG0
【内容】
- 属性(Property)
- 使用属性的原因
 - 访问器:set / get
 - 限制权限:只读 / 只写
 - 自动实现属性
 - 抽象属性
 
 - 索引器(Indexer)
- 定义
 - 索引器的重载
 
 
- 属性(Property)
 
【属性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访问器:属性只读或只写
 
- 属性的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可以加访问修饰符: private  protected   internal 
 
- 自动实现属性
- 只声明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)的更多相关文章
- python基础知识(属性property)
		
属性property property != 类属性和实例属性 访问计算后所得的值 返回所存储的值 创建用于计算的属性 @proper ...
 - C#中方法,属性与索引器
		
C#中方法,属性与索引器: TODO: 1,关于系统中常常出现的通过某一字段,查询相应实体信息(可能是一条字段或一条数据和一组泛型集合) 解说篇:1,方法,2,属性3.索引器 1.方法(1.依据状态编 ...
 - (转)c# 属性与索引器
		
属性是一种成员,它提供灵活的机制来读取.写入或计算私有字段的值. 属性可用作公共数据成员,但它们实际上是称为“访问器”的特殊方法. 这使得可以轻松访问数据,还有助于提高方法的安全性和灵活性. 一个简单 ...
 - iOS开发基础篇-transform属性
		
一. transform 属性 在OC中,通过 transform 属性可以修改对象的平移.缩放比例和旋转角度. 1)创建“基于控件初始位置”的形变 CGAffineTransformMakeRot ...
 - CSharp初级篇 1-4 this、索引器、静态、常量以及只读
		
.NET Core CSharp初级篇 1-4 本节内容为this.索引器.静态.常量以及只读 简介 在之前的课程中,我们谈论过了静态函数和字段的一小部分知识,本节内容中,我们将详细的讲解关于对象操作 ...
 - C#基础回顾(三)—索引器、委托、反射
		
一.前言 ------人生路 ...
 - set,get方法(属性,索引器)
		
很多时候我们不可以把一些字段暴露出来允许别人调用和修改,为了隐藏这些字段又便于加限制的使用,在面向对象编程中一般采用写get set函数的办法,比如: //字段_age, "_"表 ...
 - C#中索引器Indexer的学习使用
		
索引器 顾名思义,是用来索引的,那么C#中索引器是用来索引什么的呢 首先我们知道,C#中的数组是本身就可以索引的,那么C#中的类和结构呢,类和结构的实例是无法索引的,如果我们想让C#中类或者结构的实例 ...
 - C#.NET常见问题(FAQ)-索引器indexer有什么用
		
索引器就是名值对,你声明一个名值对的类,就可以给数组的指定元素赋值,也可以很方面的访问到指定元素值对应的下标(个人认为完全可以自己写一个类似的list来实现,没有必要多此一举学一个额外的方法) 复 ...
 
随机推荐
- (三)LoadRunner术语认识
			
场景:主要表现为controller中设计与执行测试用例中的用户场景.主要工作有,在controller中选择虚拟用户脚本.设置虚拟用户数量.配置虚拟用户运行时的行为.选择负载发生器.设置执行时间等. ...
 - 异步处理MultipartFile No such file or directory的分析
			
背景 项目中开发导入功能,因为数据量比较大,所以要求后端异步操作(个人觉得前端ajax处理最好,有空再试一下).但是操作中发现改为异步之后,相同代码的情况下会报(No such file or dir ...
 - 通过CSS3属性值的变化实现动画效果+触发这些动画产生交互
			
css3过渡 transition 兼容性:IE10+ transition: none | all | property 默认为none all 表示所有属性过渡 property 指定属性值,如c ...
 - 解决树莓派鼠标延迟/迟滞问题-转CSDN博主“Deiki”-sunziren
			
本文转自CSDN: https://blog.csdn.net/deiki/article/details/73252942,因为我在为树莓派安装2.4G无线键鼠的时候,鼠标反应很慢,卡顿严重(换成有 ...
 - 对于搭建网站中出现“You don't have permission to access this resource.”错误提示的解决思路
			
我是用的是树莓派搭载了ubuntu系统 配置php+apache的网站环境,但在登陆网站进行网站初始化设置时出现错误提示,其大意是没有访问权限,上网搜索了一系列相关教程,都说明对apache2.con ...
 - #AcWing系列课程Level-2笔记——4. 浮点数二分算法
			
浮点数二分算法 编写浮点数二分,记住下面的思路,代码也就游刃有余了! 1.首先找到数组的中间值,mid=(left+right)>>1,区间[left, right]被划分成[left, ...
 - Deepin Linux 升级wine应用
			
前提是升级已经安装的wine应用 参考: 微信升级 mkdir /tmp/wechat cd /tmp/wechat wget https://dldir1.qq.com/weixin/Windows ...
 - ubuntu set up 5 - VIM
			
Edit ~/.vimrc source vimrc: :so ~/.vimrc 1. ctrl - left/right 切换tabs https://vim.fandom.com/wiki/Usi ...
 - 变量 Variables
			
是为了存储(store)程序(program)运算过程中的一些信息(informations),为了方便日后调用.操作和更改 变量名应该简明,见名识意,让读者和我们自己能更清晰的了解 如果我们把变量看 ...
 - JS 字符串 String对象
			
charAt(index) 返回指定索引位置的字符 charCodeAt() 返回指定索引位置字符的 Unicode 值 indexOf(searchString, startIndex) 返回子字符 ...