一、属性(Property)作为类和结构的成员,是对字段的一种封装方式,实际上是一种特殊的方法,被称为访问器(Accessor),从而隐藏实现和验证代码,有助于提高字段读取和赋值的安全性和灵活性;

  1.属性访问器包含两种类型:用于读取并返回值的get访问器,用于赋值新值的set属性访问器;通常将字段声明为私有字段,然后通过属性来对其进行访问:

private int myNum = ; //属性要读取和赋值的字段,也被称为后备字段(Backing Field)
public int MyNum
{
get //get访问器,必须返回属性声明类型的返回值
{
return myNum;
}
set //set访问器
{
//do…赋值之前通常加入一些数据验证逻辑
myNum = value; //使用关键字value表示使用set访问器赋值的新值,其类型为属性声明类型
}
}
//使用时,像字段一样进行访问:
int num = MyNum + ; //读取属性时,调用MyNum的get访问器读取myNum的值
MyNum = ; //给属性赋值时,调用MyNum的set访问器给myNum赋值

  ※在开启优化代码选项时,对get访问器的调用将由JIT编译器进行方法内联优化,不存在方法调用开销,但无法内联虚属性的get访问器;

  2.属性根据其声明的访问器种类分为三种:读写属性(同时声明get访问器和set访问器)、只读属性(只声明get访问器)和只写访问器(只声明set访问器);

  ※只写属性很少出现,常用于限制对敏感数据的访问;

  3.访问器的可访问性默认与属性的可访问性相同,当属性同时声明了get访问器和set访问器时,可以给其中任意一个访问器添加可访问修饰符来指定其可访问性,显式声明的可访问性要比属性本身的可访问性有更严格的限制;

  ※通常通过指定公共属性的访问器可访问性来保留get访问器的公共可访问性,限制set访问器的可访问性:

public int MyNum
{
get
{
return myNum;
}
private set //将set访问器声明为私有的
{
myNum = value;
}
}

  4.当访问器中不需要任何额外逻辑时,可以使用自动实现属性(Auto-Implemented Property,简称自动属性,Auto Property)简化属性的声明方式,不再需要单独声明一个字段,将由编译器创建仅可以通过访问器访问的专用、匿名字段(无法在客户端代码中直接访问该字段),声明访问器时也不需要提供具体实现:

public int MyProperty { get; set; }

  ※自动属性的访问器依然可以使用访问修饰符;

  ※自动属性必须声明get访问器,只读的自动属性可以在初始化时和构造函数中赋值;

  ※在C#6.0以上版本中,可以像字段一样初始化自动属性:

public int MyProperty { get; set; } = ;

  ※自动属性是编译器为我们准备的一种语法糖;

  5.当属性所封装的类型是一个值类型时,使用get访问器得到的对象不能直接对其成员进行修改,详见;

  二、通过反射可以获取类型中所有的属性信息:

PropertyInfo[] myProperties = typeof(MyClass).GetProperties();
for (int i = ; i < myProperties.Length; i++)
{
Console.WriteLine(myProperties[i].Name); //MyNum
}

  1.在使用反射获取类型的所有方法时,如果类型中包含属性,也会获取属性中的公共访问器所生成的方法:

typeof(MyClass).GetMethods(); //get_MyNum set_MyNum ToString Equals GetHashCode GetType

  ※在使用反射获取类型的所有字段时,如果类型中包含自动属性,会获取到编译器自动声明的私有字段:

typeof(MyClass).GetFields(BindingFlags.NonPublic | BindingFlags.Instance); //<MyProperty>k__BackingField

  2.查看声明属性的IL代码:

  3.查看使用属性读取和赋值的IL代码:


如果您觉得阅读本文对您有帮助,请点一下“推荐”按钮,您的认可是我写作的最大动力!

作者:Minotauros
出处:https://www.cnblogs.com/minotauros/

本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

C#面向对象--属性的更多相关文章

  1. linkin大话面向对象--属性详解

    成员变量和局部变量 成员变量: 1.在一个类中,任何方法之外定义的变量:     2.从面向对象的思想来说我们又把实例变量看成一个类的属性.     3.实例变量在没有符初值时系统会自动帮我们做初始化 ...

  2. javascript面向对象属性函数用法(defineProperty与getOwnPropertyDescriptor)

    defineProperty用于设置一个对象的属性描述符,属性描述符有4个:[[Configurable]], [[Enumerable]], [[Writable]],[[Value]] 当一个属性 ...

  3. python day20面向对象-属性,类方法,静态方法

    一.属性的初识 # class Person: # # def __init__(self,name,hight,weight): # self.name = name # self.__hight ...

  4. python面向对象 : 属性, 类方法, 静态方法

    一. 属性 属性: 将方法伪装成一个属性,代码上没有什么提升,只是更合理. property应用 : 类似于bmi这种,area,周长.... 需要用到计算的.   # 求BMI体质数:BMI = 体 ...

  5. 【学习笔记】--- 老男孩学Python,day18 面向对象------ 属性,类方法,静态方法

    属性 属性: 将方法伪装成一个属性,代码上没有什么提升,只是更合理. 应用场景: 类中 要用名词时候可以用@property  比如,求面积,周长,平方,体脂 等运算时候 例如:   bmi是名词,最 ...

  6. Java自学-面向对象 属性

    Java类的属性 一个英雄有姓名,血量,护甲等等状态 这些状态就叫做一个类的属性 步骤 1 : 属性的类型 属性的类型可以是基本类型,比如int整数,float 浮点数 也可以是类类型,比如Strin ...

  7. python_面向对象——属性方法property

    1.属性方法 class Student(object): def __init__(self,name): self.name = name @property #属性方法:把一个方法变成一个静态的 ...

  8. Java的面向对象属性

    定义类 定义类的过程就是定义类的属性的过程: 类的属性就是累的静态属性的简称,指类内包含的各项数据. 类的服务被称为成员函数或方法. 继承extends 通过定义继承方法,子类可以获得父类的所有属性和 ...

  9. python全栈开发 * 22 面向对象 知识点汇总 * 180703

    22 面向对象 -----属性,类方法,静态方法,反射一.属性1.属性的定义:将方法伪装成属性,虽然在代码层面上没有任何高深之处,但让其看起来更合理. (类似于属性的方法)class Person: ...

随机推荐

  1. 吴裕雄--天生自然 pythonTensorFlow图形数据处理:输入数据处理框架

    import tensorflow as tf # 1. 创建文件列表,通过文件列表创建输入文件队列 files = tf.train.match_filenames_once("F:\\o ...

  2. 使用node 做静态文件服务器

    # 1. 使用server-static 包 使用node可以非常快速的方法把指定目录共享出去 前提条件:安装了node,附带有npm 要托管的文件目录为 /root/www # 先创建一个目录用来存 ...

  3. 5G时代将至,哪些改变会随之而来?

    近年来,运营商不断被唱衰.关键原因就在于运营商的各项业务,在互联网的冲击下已经愈发"萎缩".尤其是短信和语音通话,它们的价值在不断被降低.简而言之,运营商似乎成为了纯粹的" ...

  4. C++ 传参的方式 值传递,指针传递,引用传递

    关于传参总是搞晕,这里总结下: 值传递: void func(int n) { } void main() { int x = 1; func(x); return; } 这种就是值传递,在func函 ...

  5. 2017NOIP模拟赛三 A酱的体育课

    据说改编自$CodeM 美团点评编程大赛初赛A 轮$ 简单的水题...考试的时候没想到,xjb打了暴力. 显然,第$x$个人排在第$y$个位置的情况总数为$(n-1)!$,在这些情况中,第$x$人对答 ...

  6. 吴裕雄--天生自然python学习笔记:python 用pygame模块角色类(Sprite)移动与碰撞

    角色类(Sprite) Py game 游戏中有许多组件会重复用到,比如射击宇宙飞船的游戏中,外星宇宙 飞船可能多达数十艘 , 通过创建“角色类”,可以生成多个相同的对象. Py game 角色类是游 ...

  7. mean|mode|median|sample的表达方式

    Measures of Center measures of central tendency:the center or most typical value:average Mean:its ar ...

  8. Select(快速选择顺序统计量)原理及C++代码实现

    SELECT算法利用快排中的partition思想来进行无序数组的快速选择. 寻找第i个顺序统计量可以简单理解为寻找第i小的元素. 该算法通过为partition选择一个好的主元,来保证Partiti ...

  9. 2)header的使用

    header() 函数向客户端发送原始的 HTTP 报头. 认识到一点很重要,即必须在任何实际的输出被发送之前调用 header() 函数(在 PHP 以及更高的版本中,您可以使用输出缓存来解决此问题 ...

  10. Euler characteristic

    Euler characteristic Euler定理 顶点(v),棱数(edge)(e),面(J) 尽管我们有四个不同的四面体,但是如果我们将顶点数\((v)\)减去棱数\((e)\)再加上四面体 ...