C#面向對象--屬性

来源:https://www.cnblogs.com/minotauros/archive/2020/02/29/12386671.html
-Advertisement-
Play Games

一、屬性(Property)作為類和結構的成員,是對欄位的一種封裝方式,實際上是一種特殊的方法,被稱為訪問器(Accessor),從而隱藏實現和驗證代碼,有助於提高欄位讀取和賦值的安全性和靈活性; 1.屬性訪問器包含兩種類型:用於讀取並返回值的get訪問器,用於賦值新值的set屬性訪問器;通常將欄位 ...


  一、屬性(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/

本文版權歸作者和博客園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接,否則保留追究法律責任的權利。

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • Spring Cloud官網: 本篇主要講 "Spring Cloud Config" ,參考內容如下: "Spring Cloud Config 2.2.1.RELEASE參考文檔" "Spring Cloud Config 實現配置中心,看這一篇就夠了" 實現簡單的配置中心 配置文件就在Spri ...
  • 接上篇博文—— "《詳解 繼承(上)—— 工具的抽象與分層》" 廢話不多說,進入正題: 本人在上篇“故弄玄虛”,用super();解決了問題,這是為什麼呢? 答曰:子類中所有的構造方法 預設 都會訪問父類中 空參數的構造方法 (拓展:由於這個原理,我們今後所做的“ 工具類 ”都必須要帶上無參構造) ...
  • 本篇博文講解的知識點比較實用,但是,相關知識點太多,所以本人將內容分為上下兩冊, 那麼,本人就不多廢話,直接進入主題進行講解了! 說到“繼承”,大家可能都會想到我們日常中對於這個詞的定義:將先人的 物品 或 意志 傳承給後人,而後人也可以“擇優繼承”,併在先人的基礎上產生 新的物品 或 新的意志。 ...
  • 1、格式 (數據1,數據2,數據3,...) 定義元組使用小括弧,且逗號隔開各個數據,數據可以是不同的數據類型。 元組和列表的區別:元組存儲的數據不能修改 2、定義的類型 單數據元組和多數據元組 t1 = (1, 2) print(type(t1)) # tuple 多數據元組 t2 = (1,) ...
  • Title:ElasticSearch實戰系列四: ElasticSearch的聚合查詢基礎使用教程之度量(Metric)聚合 前言 在上上一篇中介紹了 "ElasticSearch實戰系列三: ElasticSearch的JAVA API使用教程" ,介紹了ElasticSearch Java A ...
  • [toc] 泛型: 首先,本人來介紹一下 什麼是泛型 : 泛型概述 : 是一種把類型明確的工作 推遲到創建對象 或者 調用方法的時候 才去 明確的特殊的類型 。 參數化類型 ,把類型當作參數一樣的傳遞。 通俗一點來講:泛型 是JAVA 中一種十分強大的機制,因為它能夠完成在 未知元素類型 的情況下對 ...
  • 在Java發展的里程碑上,有三個版本做出的改動,是革命性的 為什麼說是革命性的呢? 因為這三個版本所推出的有些新機制,在之後的Java框架開發、新類的產生等等中, 都被廣泛使用了。 那麼,這三個版本的JDK,都有哪些新特性呢? 現在,右轉哥就來帶你剖析這三個版本的JDK的新特性: [toc] 首先是 ...
  • xml配置 1.xml基本結構: 其中id是bean字元串,bean的唯一標識符,相當於對象名,class是bean類名的完全限定路徑 2.別名 起別名有兩種方式, 1.通過alias 2.通過bean中的name屬性 用bean中name更高級,可以起多個別名 IoC創建對象方式 1.通過無參構造 ...
一周排行
    -Advertisement-
    Play Games
  • 示例項目結構 在 Visual Studio 中創建一個 WinForms 應用程式後,項目結構如下所示: MyWinFormsApp/ │ ├───Properties/ │ └───Settings.settings │ ├───bin/ │ ├───Debug/ │ └───Release/ ...
  • [STAThread] 特性用於需要與 COM 組件交互的應用程式,尤其是依賴單線程模型(如 Windows Forms 應用程式)的組件。在 STA 模式下,線程擁有自己的消息迴圈,這對於處理用戶界面和某些 COM 組件是必要的。 [STAThread] static void Main(stri ...
  • 在WinForm中使用全局異常捕獲處理 在WinForm應用程式中,全局異常捕獲是確保程式穩定性的關鍵。通過在Program類的Main方法中設置全局異常處理,可以有效地捕獲並處理未預見的異常,從而避免程式崩潰。 註冊全局異常事件 [STAThread] static void Main() { / ...
  • 前言 給大家推薦一款開源的 Winform 控制項庫,可以幫助我們開發更加美觀、漂亮的 WinForm 界面。 項目介紹 SunnyUI.NET 是一個基於 .NET Framework 4.0+、.NET 6、.NET 7 和 .NET 8 的 WinForm 開源控制項庫,同時也提供了工具類庫、擴展 ...
  • 說明 該文章是屬於OverallAuth2.0系列文章,每周更新一篇該系列文章(從0到1完成系統開發)。 該系統文章,我會儘量說的非常詳細,做到不管新手、老手都能看懂。 說明:OverallAuth2.0 是一個簡單、易懂、功能強大的許可權+可視化流程管理系統。 有興趣的朋友,請關註我吧(*^▽^*) ...
  • 一、下載安裝 1.下載git 必須先下載並安裝git,再TortoiseGit下載安裝 git安裝參考教程:https://blog.csdn.net/mukes/article/details/115693833 2.TortoiseGit下載與安裝 TortoiseGit,Git客戶端,32/6 ...
  • 前言 在項目開發過程中,理解數據結構和演算法如同掌握蓋房子的秘訣。演算法不僅能幫助我們編寫高效、優質的代碼,還能解決項目中遇到的各種難題。 給大家推薦一個支持C#的開源免費、新手友好的數據結構與演算法入門教程:Hello演算法。 項目介紹 《Hello Algo》是一本開源免費、新手友好的數據結構與演算法入門 ...
  • 1.生成單個Proto.bat內容 @rem Copyright 2016, Google Inc. @rem All rights reserved. @rem @rem Redistribution and use in source and binary forms, with or with ...
  • 一:背景 1. 講故事 前段時間有位朋友找到我,說他的窗體程式在客戶這邊出現了卡死,讓我幫忙看下怎麼回事?dump也生成了,既然有dump了那就上 windbg 分析吧。 二:WinDbg 分析 1. 為什麼會卡死 窗體程式的卡死,入口門檻很低,後續往下分析就不一定了,不管怎麼說先用 !clrsta ...
  • 前言 人工智慧時代,人臉識別技術已成為安全驗證、身份識別和用戶交互的關鍵工具。 給大家推薦一款.NET 開源提供了強大的人臉識別 API,工具不僅易於集成,還具備高效處理能力。 本文將介紹一款如何利用這些API,為我們的項目添加智能識別的亮點。 項目介紹 GitHub 上擁有 1.2k 星標的 C# ...