C# 屬性(Property)?詳解

在 C# 中,?屬性(Property)? 是類或結構體中的成員,用于封裝對私有字段(稱為 ?backing field?)的訪問,提供更靈活和安全的數據操作方式。屬性通過 get 和 set 訪問器控制對數據的讀寫,是面向對象編程中封裝思想的核心實踐。


屬性的核心作用?

  • 封裝數據?:隱藏類的內部字段,通過屬性暴露可控的訪問接口。
  • 驗證邏輯?:在 set 訪問器中添加數據驗證邏輯。
  • 計算屬性?:動態生成值(例如根據其他字段計算)。
  • 簡化語法?:自動屬性(Auto-Implemented Properties)讓代碼更簡潔。

?屬性的基本語法?

public class Person
{// 私有字段(backing field)private string _name;// 屬性:控制對 _name 的讀寫public string Name{get { return _name; }set { _name = value?.Trim(); } // 示例:自動去除空格}
}

?屬性的常見類型?

1. ?自動實現屬性(Auto-Implemented Property)?
不需要手動定義 backing field,編譯器自動生成。

public int Age { get; set; } // 默認可讀寫
public string Id { get; }     // 只讀屬性(只能在構造函數中賦值)

2. ?計算屬性(Computed Property)?
根據其他字段動態返回值:

public class Rectangle
{public double Width { get; set; }public double Height { get; set; }// 計算面積(只讀)public double Area => Width * Height;
}

3. ?帶有驗證的屬性?
在 set 訪問器中添加邏輯:

private int _age;
public int Age
{get => _age;set{if (value < 0)throw new ArgumentException("年齡不能為負數!");_age = value;}
}

4. ?表達式體屬性(C# 6+)?
簡化單行邏輯的屬性:

public string FullName => $"{FirstName} {LastName}";

5. ?Init-only 屬性(C# 9+)?
只能在對象初始化時賦值:

public string Name { get; init; }
// 使用:
var person = new Person { Name = "Alice" }; // 合法
person.Name = "Bob"; // 編譯錯誤!

?屬性 vs 字段?

?字段(Field)??屬性(Property)?
直接暴露數據,無訪問控制。封裝數據,通過 get/set 控制訪問。
無法添加驗證或邏輯。支持數據驗證、動態計算等。
例如:public string Name;例如:public string Name { get; set; }

最佳實踐?

1?、優先使用屬性?:避免直接暴露公有字段。
2?、保持屬性簡單?:避免在屬性中編寫復雜邏輯(應交給方法)。
?3、只讀屬性?:若數據不應被外部修改,使用 { get; private set; } 或 init。
?4、線程安全?:在屬性中處理多線程訪問時需加鎖。

?示例:完整用法?

public class User
{private string _email;public string Email{get => _email;set{if (string.IsNullOrEmpty(value) || !value.Contains("@"))throw new ArgumentException("郵箱格式無效!");_email = value;}}// 自動屬性 + 默認值public DateTime CreatedAt { get; } = DateTime.Now;
}// 使用:
var user = new User();
user.Email = "test@example.com"; // 合法
user.Email = "invalid";          // 拋出異常

掌握屬性是 C# 開發的基礎,它能顯著提升代碼的可維護性和健壯性。

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

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

相關文章

iPhone 16如何翻譯文檔?文檔翻譯技巧、軟件推薦

在全球化的今天&#xff0c;跨語言交流變得越來越頻繁&#xff0c;而文檔翻譯更是成為許多人日常工作和學習中的重要需求。作為蘋果公司最新推出的旗艦機型&#xff0c;iPhone 16憑借其強大的硬件性能和豐富的軟件生態&#xff0c;為我們提供了多種便捷的文檔翻譯方式&#xff…

HRP方法全文總結與模型流程解析

背景與問題 傳統二次優化方法&#xff08;如Markowitz的CLA&#xff09;存在三大問題&#xff1a; 不穩定性&#xff1a;協方差矩陣的高條件數導致逆矩陣計算誤差放大&#xff0c;權重劇烈波動。 集中性&#xff1a;優化結果過度集中于少數資產&#xff0c;易受個體風險沖擊。…

解決項目一直在構建中的問題:以 IntelliJ IDEA 為例提高共享堆內存

在使用 IntelliJ IDEA 時&#xff0c;開發者可能會遇到項目長期處于構建狀態的問題。這種情況將嚴重影響開發效率。通常&#xff0c;這種問題的一個常見原因是構建進程所分配的堆內存不足。本文將以 IntelliJ IDEA 為背景&#xff0c;介紹如何通過提高共享堆內存來解決此問題&a…

金橙子刪除打標對象

注意在使用金橙子根據對象名稱刪除對象時要注意,每刪除一個對象,所有對象的索引都將改變。 如果你是用for去遍歷,再根據索引獲取打標對象名稱的話就會出現漏的掉的問題。 改進方法 1,將要刪除的對象找到后,統一存放在一個集合中。再根據這個要刪除的對象集合再一個個去遍…

JVM常見概念之條件移動

問題 當我們有分支頻率數據時&#xff0c;有什么有趣的技巧可以做嗎&#xff1f;什么是條件移動&#xff1f; 基礎知識 如果您需要在來自一個分支的兩個結果之間進行選擇&#xff0c;那么您可以在 ISA 級別做兩件不同的事情。 首先&#xff0c;你可以創建一個分支&#xff…

MANISKILL3:GPU 并行機器人模擬和渲染,用于通用的具身AI

本文介紹了一種名為ManiSkill3的機器人仿真系統&#xff0c;它采用了GPU并行化技術&#xff0c;并針對通用性進行了優化。該系統支持多種視覺輸入方式和異構模擬&#xff0c;能夠在物理場景中進行高效的仿真和渲染&#xff0c;達到比其他平臺更快的速度和更少的GPU內存使用量。…

計算機網絡高頻(三)UDP基礎

計算機網絡高頻(三)UDP基礎 1.UDP的頭部格式是什么樣的?? UDP 頭部具有以下字段: 源端口(Source Port):16 位字段,表示發送方的端口號。目標端口(Destination Port):16 位字段,表示接收方的端口號。長度(Length):16 位字段,表示 UDP 數據報(包括頭部和數據部…

微信小程序中使用Less樣式方法

在微信小程序中使用Less樣式&#xff0c;可以通過以下步驟實現。主要原理是借助Visual Studio Code&#xff08;VSCode&#xff09;的插件將Less文件自動編譯為小程序支持的.wxss文件&#xff0c;或通過微信開發者工具的擴展功能直接集成Less編譯環境。以下是具體方法&#xff…

Leetcode 刷題筆記 圖論part05

卡碼網 107 尋找存在的路徑 初識并查集 并查集功能&#xff1a; 尋找根節點&#xff0c;函數: find(int u)&#xff0c;也就是判斷這個節點的祖先節點是哪個將兩個節點接入到同一個集合&#xff0c;函數: join(int u, int v)&#xff0c;將兩個節點連在同一個根節點上判斷兩…

SpringBoot星之語明星周邊產品銷售網站設計與實現

在當今數字化時代&#xff0c;明星周邊產品的線上銷售已成為一種趨勢。幽絡源作為一站式綜合平臺&#xff0c;不僅提供免費源碼、網絡兼職資源&#xff0c;還分享各類技術教程。本文將詳細介紹基于SpringBoot的星之語明星周邊產品銷售網站的設計與實現&#xff0c;幫助開發者快…

怎樣對比找到兩個git倉庫的差異

怎樣對比找到兩個git倉庫的差異 陳拓 2024/12/24-2024/12/28 1. 概述 要比較兩個Git倉庫的差異&#xff0c;可以使用git diff命令。你需要先將兩個倉庫的克隆版本都檢出到本地&#xff0c;然后在對應的目錄中運行git diff命令。 下面我們以YDLIDAR ROS2驅動程序ydlidar_ros2…

C語言-裝飾器模式詳解與實踐 - LED控制系統

文章目錄 C語言裝飾器模式詳解與實踐 - LED控制系統1. 什么是裝飾器模式&#xff1f;2. 為什么需要裝飾器模式&#xff1f;3. 實際應用場景4. 代碼實現4.1 頭文件 (led_decorator.h)4.2 實現文件 (led_decorator.c)4.3 使用示例 (main.c) 5. 代碼分析5.1 關鍵設計點5.2 實現特點…

Go常見問題與回答(下)

文章目錄 1、通過指針變量 p 訪問其成員變量 name&#xff0c;有哪幾種方式&#xff1f;2、代碼&#xff0c;說出結果3、擴容提&#xff0c;代碼&#xff0c;說出結果4、指出下面這段代碼的錯誤之處5、是否通過編譯6、關于字符串連接&#xff0c;下面語法正確的是7、關于iota&a…

JVM 核心知識點總結

&#x1f9d1; 博主簡介&#xff1a;CSDN博客專家&#xff0c;歷代文學網&#xff08;PC端可以訪問&#xff1a;https://literature.sinhy.com/#/literature?__c1000&#xff0c;移動端可微信小程序搜索“歷代文學”&#xff09;總架構師&#xff0c;15年工作經驗&#xff0c;…

SQL中體會多對多

我們可以根據學生與課程多對多關系的數據庫模型&#xff0c;給出實際的表數據以及對應的查詢結果示例&#xff0c;會用到JOINLEFT JOIN兩種連接 1. 學生表&#xff08;students&#xff09; student_idstudent_name1張三2李四3王五 2. 課程表&#xff08;courses&#xff09…

ES如果要查10條數據需要從各個分片上各取多少條數據?

目錄 ES如果要查10條數據需要從各個分片上各取多少條數據? 簡單查詢(如 match_all 或 term 查詢) 深度分頁查詢(如 from + size 查詢) 聚合查詢 什么叫聚合查詢? 聚合查詢的基本結構 常見的聚合類型 聚合查詢的執行過程 聚合查詢的示例 聚合查詢的應用場景 注意…

人機交互自學引導

第1關&#xff1a;輸出“Hello World!” # 在下面一行補充代碼&#xff0c;輸出“Hello World!” print(Hello World!) 第2關&#xff1a;輸出“李白&#xff0c;你好&#xff01;” # 在下面補充代碼&#xff0c;在兩行中依次輸出“李白&#xff0c;你好&#xff01;”和“…

CentOS 7 更換 yum 源(阿里云)+ 擴展 epel 源

CentOS 7 更換 yum 源&#xff08;阿里云&#xff09; 擴展 epel 源 一、備份現有 yum 源二、下載 yum 源&#xff08;任選其一即可&#xff09;三、清理并生成緩存四、安裝 EPEL 擴展源&#xff08;根據需要下載&#xff09;五、驗證是否生效六、一鍵腳本&#xff08;阿里云源…

無人機與傳統巡檢優劣勢對比!

一、無人機巡檢的優勢 1. 高效性 覆蓋范圍廣&#xff1a;可快速掃描大范圍區域&#xff08;如電力線路、管道、農田等&#xff09;&#xff0c;尤其適合復雜地形&#xff08;山區、沼澤等&#xff09;。 速度快&#xff1a;飛行速度遠高于人工巡檢&#xff0c;縮短任務周期…

DrRacket是一款專為Scheme和Racket編程語言設計的集成開發環境(IDE)

DrRacket是一款專為Scheme和Racket編程語言設計的集成開發環境&#xff08;IDE&#xff09;&#xff0c;由瑞士蘇黎世聯邦理工學院開發。它不僅是初學者學習編程的理想工具&#xff0c;也適用于專業級開發?。 安裝DrRacket 請訪問https://download.racket-lang.org安裝Racke…