C#:第一性原理拆解屬性(property)

目錄

第一步:從最基本的需求出發

第二步:引入控制需求

第三步:優化訪問方式

第四步:剖析屬性的本質

第五步:進一步簡化和演化

第六步:總結屬性的第一性原理

我們用第一性原理(First Principles)來拆解和理解 C# 中的“屬性”(Properties)。

第一步:從最基本的需求出發

在編程中,我們需要處理數據。假設我們有一個對象,比如一個表示“人”的類:

  • 這個“人”有名字(Name)和年齡(Age)等信息。

  • 我們需要一種方式來存儲這些信息,并且能夠訪問和修改它們。

最簡單的方法是直接用字段(Field):

public class Person {public string name;public int age;
}

這樣可以用 person.name = "Alice"; 或 int currentAge = person.age; 來操作數據。但這有個問題:字段是完全公開的,任何代碼都可以隨意讀寫,沒有控制。?

第二步:引入控制需求

假設我們希望:

  1. 保護數據:不讓外部直接修改字段(封裝性)。

  2. 增加邏輯:比如驗證年齡不能是負數,或者在讀取名字時總是返回大寫形式。

為了實現這個控制,我們可以用私有字段(private field)加上方法(getter 和 setter):

public class Person {private string name;private int age;public string GetName() {return name.ToUpper(); // 返回大寫名字}public void SetName(string value) {name = value; // 簡單賦值}public int GetAge() {return age;}public void SetAge(int value) {if (value >= 0) // 驗證邏輯age = value;}
}

這樣我們通過方法控制了對 name 和 age 的訪問。但問題來了:

  • 寫起來很繁瑣,每個字段都需要兩個方法。

  • 使用時不夠直觀,要寫 person.SetAge(25) 而不是 person.age = 25。

第三步:優化訪問方式

從第一性原理看,我們想要:

  1. 字段的簡潔語法(像 person.age = 25 這樣直接賦值)。

  2. 方法的控制能力(能在賦值或取值時加邏輯)。

C# 的設計者觀察到這個需求,提出了“屬性”(Properties)作為解決方案。屬性本質上是字段訪問的“語法糖”,背后是對 getter 和 setter 方法的封裝。我們可以用屬性改寫上面的代碼:

public class Person {private string name;private int age;public string Name {get { return name.ToUpper(); }set { name = value; }}public int Age {get { return age; }set { if (value >= 0) age = value; }}
}

現在可以用 person.Name = "Alice"; 和 int currentAge = person.Age; 來操作,語法簡潔,同時保留了邏輯控制。?

第四步:剖析屬性的本質

從底層看,屬性不是字段,而是編譯器生成的一對方法:

  • get_Name():取值時調用。

  • set_Name(string value):賦值時調用,value 是關鍵字,表示傳入的值。

編譯器把屬性翻譯成這樣的方法調用,但讓我們用字段的語法來訪問。這是一種折中:

  • 形式上像字段,方便使用。

  • 本質上是方法,提供靈活性。

可以用 IL 反編譯工具(比如 ILSpy)驗證:屬性會被編譯成 get_XXX 和 set_XXX 方法。

第五步:進一步簡化和演化

如果屬性只是簡單地讀寫字段,沒有額外邏輯,C# 提供了自動屬性(Auto-Implemented Properties):

public class Person {public string Name { get; set; }public int Age { get; set; }
}

這里:

  • 編譯器自動生成一個私有字段(通常命名為 <Name>k__BackingField)。

  • 自動生成 getter 和 setter。

這進一步減少了代碼量,但仍然保留了屬性作為“接口”的本質。如果你以后需要加邏輯,可以直接擴展:

public int Age {get { return age; }set { if (value >= 0) age = value; }
}

第六步:總結屬性的第一性原理

從最基本的需求出發,C# 的屬性是為了解決以下問題:

  1. 數據封裝:通過私有字段隱藏實現細節。

  2. 訪問控制:通過 getter 和 setter 提供邏輯。

  3. 語法簡潔:讓開發者用類似字段的方式操作對象。

屬性不是憑空發明的,而是基于“數據 + 行為”的基本編程需求,結合“簡潔性 + 靈活性”的設計目標演化而來。它是字段和方法的“中間態”,既不是單純的存儲,也不是完全的方法,而是一種更高層次的抽象。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/73876.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/73876.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/73876.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

-PHP 應用文件上傳函數缺陷條件競爭二次渲染黑白名單JS 繞過

#學習前必讀&#xff1a; 1 、課前一定要明白&#xff1a; 無文件解析安全問題上&#xff0c;格式解析是一對一的&#xff08;不能 jpg 解析 php &#xff09; 換句話來說有解析錯誤配置或后綴解析漏洞時才能實現格式差異解析 2 、文件上傳安全指的是攻擊者通過利用上傳…

C++的模板(十四):更多的自動內存管理

在前文《C的模板(八)&#xff1a;子系統》class DMM&#xff0c;給出了一個自動動態內存管理的例子。https://blog.csdn.net/aaasssdddd96/article/details/139921880 它使用了一個list容器&#xff0c;把兩個類型兼容的指針存放在一起。在new的時候&#xff0c;隨即就把得到的…

Windows下VSCode的安裝

前言 VSCode的安裝看起來平平無奇&#xff0c;但也不是輕輕松松的。筆者將最新的Windows下安裝VSCode&#xff0c;以及運行最簡單的C程序的過程記錄下來&#xff0c;供后續的自己和大家參考。 一、官網下載安裝包 Visual Studio Code - Code Editing. Redefined 二、安裝 直接…

Matlab教程004:Matlab矩陣的拼接重構重排以及矩陣的運算

文章目錄 1.4.3 矩陣的拼接重構重排1.4.3.1 橫向拼接1.4.3.2 縱向拼接1.4.3.3 矩陣的重構重排 1.4.4 矩陣的運算1.4.4.1 算數運算1.4.4.2 矩陣加減1.4.4.3 矩陣乘法1.4.4.4 矩陣轉置 1.4.3 矩陣的拼接重構重排 1.4.3.1 橫向拼接 A和B的行數相同&#xff0c;那么使用[A,B]、[A …

Python小練習系列 Vol.3:生成有效括號組合(回溯 + DFS)

&#x1f9e0; Python小練習系列 Vol.3&#xff1a;生成有效括號組合&#xff08;回溯 DFS&#xff09; &#x1f44b; 本期我們來刷一道 LeetCode 熱門經典題&#xff0c;借此掌握回溯算法的精髓 —— 生成有效括號組合&#xff0c;是學習遞歸 & DFS 的黃金題型&#xff…

實戰經驗深度解析 | 博睿數據制造行業精選案例集發布!

近年來&#xff0c;我國制造業加速邁向高端化、智能化、綠色化&#xff0c;為經濟高質量發展注入新動能。放眼全球&#xff0c;制造業正加速數字化、智能化轉型&#xff0c;5G、人工智能、邊緣計算等技術與生產全流程深度融合&#xff0c;有力推動柔性化生產與產業鏈協同創新發…

[創業之路-344]:戰略的本質是選擇、聚焦, 是成本/效率/低毛利優先,還是差易化/效益/高毛利優先?無論是成本優先,還是差易化戰略,產品聚焦是前提。

前言&#xff1a; 一、戰略的本質是選擇、聚焦 關于戰略的本質&#xff0c;觸及了商業競爭的核心矛盾&#xff1a;選擇成本優先&#xff08;效率/低毛利&#xff09;還是差異化&#xff08;效益/高毛利&#xff09;&#xff0c;本質上是對企業戰略方向的終極拷問。 1、戰略選…

項目代碼第10講【數據庫運維知識——如何優化數據庫查詢效率?】:各種日志查看;主從復制;分庫分表(MyCat);讀寫分離;區別數據分區、分表、分庫

01. 運維-課程介紹_嗶哩嗶哩_bilibili 一、各種日志查看 二、主從復制 三、分庫分表&#xff08;MyCat&#xff09; 四、讀寫分離 五、區別數據分區、分表、分庫 1、數據庫分區 上圖中的ibd文件&#xff0c;是分區表的數據文件&#xff0c;可以分布在不同的物理設備上&…

OpenCV圖像拼接(10)用于實現圖像拼接過程中的時間流逝(timelapse)效果的一個類cv::detail::Timelapser

操作系統&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 編程語言&#xff1a;C11 算法描述 cv::detail::Timelapser 是 OpenCV 庫中用于實現圖像拼接過程中的時間流逝&#xff08;timelapse&#xff09;效果的一個類。它通常用于將一系列…

Transformer 通關秘籍2:利用 BERT 將文本 token 化

前面兩節分別通過兩個代碼示例展示了模型將文本轉換為 token 之后是什么樣的&#xff0c;希望你可以對此有一個感性的認識。 本節來簡要介紹一下將一個連續的文本轉換為 token 序列的大致過程&#xff0c;這個過程被稱為分詞&#xff0c;也叫 tokenization。 在你沒了解這方面…

Optional的stream方法,flatMap, filter應用

Java 8引入的Optional和Stream徹底改變了我們處理空值和集合操作的方式。本文將深入探討如何將二者結合使用&#xff0c;通過四個核心場景提升代碼的健壯性和簡潔性。 一、Optional構成的Stream&#xff1a;空值自動過濾 當處理Optional集合時&#xff0c;我們常需要過濾掉空…

參加李繼剛線下活動啟發:未來提示詞還會存在嗎?

上周六&#xff0c;我參加了李繼剛老師組織的線下活動。 現場干貨滿滿&#xff0c;尤其是關于 AI 時代提示詞的價值、與 AI 溝通的藝術等話題&#xff0c;李老師的分享如同醍醐灌頂&#xff0c;讓我對 AI 人機協作有了更深的理解。 將幾點核心收獲整理出來&#xff0c;與大家…

Python基礎知識第二天:從格式化到流程控制

Python基礎知識第二天&#xff1a;從格式化到流程控制 大家好&#xff01;今天我們來梳理Python的一些重要基礎知識&#xff0c;包括格式化輸出、輸入函數、運算符以及流程控制語句。 1. 格式化輸出 Python提供了多種格式化輸出的方式&#xff1a; # %d, %f, %s 格式化name &q…

GDB: coredump

前言&#xff1a;一句話如下使用 gdb [exec_file] [core_file] # or gdb -c [core_file] [exec_file] #-c指定轉儲的core文件 gdb -c core.5213 spp_uc_frequent_contact_ol_worker # 進入后輸入bt查看調用棧 bt #顯示所有幀棧 bt 10 #顯示前面10個幀棧(感覺沒啥用) bt …

21_js正則_表單驗證

目錄 正則 一、 正則的概念 二、創建正則方式 2.1 構造函數去創建正則 2.2 字面量去創建正則 2,3 test方法 三、正則修飾符 四、 正則的方法 lastIndex test方法 exec 五、字符串方法 replace match search split 六、正則表達式的構成 元字符-- 定位符 元字…

礦山自動化監測解決方案

1.行業現狀 為貫徹落實《中共中央國務院關于推進安全生產領域改革發展的意見》《“十四五”礦山安全生產規劃》&#xff08;應急〔2022〕64號&#xff09;、《國務院安委會辦公室關于加強礦山安全生產工作的緊急通知》&#xff08;安委辦〔2021〕3號&#xff09;等有關工作部署…

企業級知識庫建設:自建與開源產品集成的全景解析 —— 產品經理、CTO 與 CDO 的深度對話

文章目錄 一、引言二、主流產品與方案對比表三、自建方案 vs. 開源產品集成&#xff1a;技術路徑對比3.1 自建方案3.2 開源產品集成方案 四、結論與個人觀點 一、引言 在當今數據驅動的商業環境中&#xff0c;構建高質量的知識庫已成為企業數字化轉型的關鍵一環。本博客分別從…

【藍橋杯】單片機設計與開發,溫度傳感器DS18B20

一、溫度傳感器概述 結構圖 二、通信過程 三、onewire單總線協議概述 四、單總線的工作原理 黑粗線是單片機發送的&#xff0c;淺的是s18b20回應的 五、溫度傳感器的應用 六、onewire 七、課后習題

Python 在Word中查找并替換文本

在操作Word文檔時&#xff0c;如果想要修正一處反復出現的拼寫錯誤&#xff0c;統一文中前后不一致的術語&#xff0c;或者將文檔中所有的舊聯系方式更新為新號碼。這時我們可以使用 Word中的查找替換功能&#xff0c;快速定位并批量處理文檔中的特定文本&#xff0c;提升編輯效…

Python 筆記 (二)

Python Note 2 1. Python 慢的原因2. 三個元素3. 標準數據類型4. 字符串5. 比較大小: 富比較方法 rich comparison6. 數據容器 (支持*混裝* )一、允許重復類 (list、tuple、str)二、不允許重復類 (set、dict)1、集合(set)2、字典(dict)3、特殊: 雙端隊列 deque 三、數據容器的共…