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
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...