zoukankan      html  css  js  c++  java
  • C#面向对象--属性

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

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

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

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

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

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

    PropertyInfo[] myProperties = typeof(MyClass).GetProperties();
    for (int i = 0; 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/

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

  • 相关阅读:
    layui弹出层处理(获取、操作弹出层数据等)
    Unity3D判断鼠标向右或向左滑动,响应不同的事件
    (转载)李剑英的CSLight入门指南结合NGUI热更新
    Unity3D研究院之LZMA压缩文件与解压文件
    CSLight研究院之学习笔记结合NGUI(一)
    《暗黑世界GM管理后台系统》部署+功能说明文档
    Firefly卡牌手游《暗黑世界V1.5》服务器端源码+GM管理后台源码
    电信SDK Pay函数里面System.out.print 无输出消息
    WP8:在Unity中使用OpenXLive
    WP8:Unity3D之间的值传递
  • 原文地址:https://www.cnblogs.com/firebet/p/12713145.html
Copyright © 2011-2022 走看看