C# --- Field and Property

C# --- Field and Property

  • 字段 (Field) vs. 屬性 (Property)
  • Property的聲明初始化方法
  • 單例類property錯誤初始化導致線程泄漏

字段 (Field) vs. 屬性 (Property)

字段 (Field) - 數據的存儲容器

  • 字段是直接在類或結構中聲明的變量。它是存儲數據的地方,是對象狀態的核心組成部分。
  • 目的:純粹用于數據存儲。
  • 訪問控制:通過訪問修飾符(如 public, private, internal) 來控制誰可以訪問這個存儲容器。
  • 關鍵點:根據面向對象的最佳實踐,字段應該幾乎總是 private 的,將其視為類的內部實現細節。將其暴露為 public 破壞了封裝性,是不推薦的做法。
public class Person
{// 私有字段 - 正確的做法private string _name;private int _age;// 公共字段 - 極其不推薦!任何代碼都可以隨意修改,無法控制。public string NickName;
}

屬性 (Property) - 數據的訪問控制器

  • 屬性是一種特殊的類成員,它提供了對私有字段進行讀取、寫入或計算的靈活機制。它本質上是兩個特殊方法(get 和 set 訪問器)的包裝。
  • 目的:控制對字段的訪問。它對外提供一個像字段一樣簡單的訪問接口,但在內部你可以實現復雜的邏輯。
  • 優勢:
  • 封裝:將數據的存儲(私有字段)和數據的訪問(公共屬性)分離。
  • 數據驗證:可以在 set 訪問器中驗證數據的有效性。
  • 計算能力:可以在 get 訪問器中返回計算后的值。
  • 精細訪問控制:可以分別設置 get 和 set 的訪問級別。
public class Person
{// 私有后備字段 (Private backing fields)private string _name;private int _age;// 公共屬性 (Public Properties)public string Name{get { return _name; }set {if (!string.IsNullOrWhiteSpace(value))_name = value;}}public int Age{get { return _age; }set {if (value >= 0 && value <= 120) // 數據驗證_age = value;elsethrow new ArgumentException("Invalid age.");}}// 計算屬性:沒有后備字段,值由其他字段計算得出public string Description{get { return $"{Name} is {Age} years old."; }}
}

Property的聲明初始化方法

完整屬性聲明(Full Property)

  • 這是最傳統、最詳細的屬性聲明方式,顯式地定義了后備字段和訪問器邏輯。
private string _name; // 后備字段public string Name
{get { return _name; }set { _name = value; }
}

自動屬性(Auto-Implemented Property)

  • C# 3.0 引入的簡潔語法,編譯器會自動生成隱藏的后備字段。
public string Name { get; set; }

只讀自動屬性(Read-Only Auto-Property)

  • C# 6.0 引入的語法,只能在構造函數中初始化。
public string Id { get; } // 只能在構造函數中賦值public MyClass(string id)
{Id = id;
}

自動屬性初始化器(Auto-Property Initializer)

  • C# 6.0 引入,允許在聲明時為自動屬性提供默認值。
public string Name { get; set; } = "Unknown";
public int Age { get; set; } = 18;
public List<string> Items { get; set; } = new List<string>();

表達式主體屬性(Expression-Bodied Property)

  • C# 7.0 引入,使用 Lambda 表達式語法 (=>) 定義只讀屬性。
public string FullName => $"{FirstName} {LastName}";
public double Area => Width * Height;
public bool IsValid => !string.IsNullOrEmpty(Name) && Age > 0;

Init-only 屬性(Init-Only Property)

  • C# 9.0 引入,允許在對象初始化期間設置屬性值,之后變為只讀。
public string Name { get; init; }
public int Age { get; init; }// 使用對象初始化器
var person = new Person { Name = "Alice", Age = 25 };

具有不同訪問級別的屬性

  • 可以為 get 和 set 訪問器設置不同的訪問修飾符。
// 公共獲取,內部設置
public string Name { get; internal set; }// 公共獲取,私有設置
public int Age { get; private set; }// 受保護的獲取,私有設置
public string Details { get; protected set; }

單例類property錯誤初始化導致線程泄漏

單例類property錯誤初始化導致線程泄漏

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

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

相關文章

【Python】實現一個文件夾快照與比較工具

1. 工具簡介 在日常開發、項目管理或備份場景中&#xff0c;我們經常需要知道某個文件夾中的文件是否發生變化&#xff0c;例如&#xff1a; 項目源碼是否新增或修改文件&#xff1f;數據集是否被不小心刪除或篡改&#xff1f;備份文件夾是否和上次一致&#xff1f; 本教程將教…

LINUX913 shell:set ip [lindex $argv 0],\r,send_user,spawn ssh root@ip “cat “

問題 獲取公鑰 [codesamba ~]$ cat pub.sh #!/bin/usr/expect set ip "$1" set password 123456 set timeout 20 spawn ssh root192.168.235.100:cat ~/.ssh/id_rsa.pub expect { "yes/no" {send "yes/r";exp_continue} "password:" {…

Acwing算法基礎課--鏈表

一、單鏈表 AcWing 826. 單鏈表 代碼 N 100010 idx 0 e [0] * N ne [0] * N head -1def init():global idx,headidx 0head -1def add_head(x):global idx,heade[idx] xne[idx] headhead idxidx 1def delete(k):ne[k] ne[ne[k]]def add_k(k,x):global idxe[idx] …

AI表征了西方的有界,AI+體現了東方的無界

AI表征了西方的有界&#xff0c;AI體現了東方的無界&#xff0c;試圖通過文化差異的視角來對比傳統AI&#xff08;AI&#xff09;與增強型或融合型AI&#xff08;AI&#xff09;的特征。一、“AI表征了西方的有界”西方的“有界”可以理解為&#xff1a;1、邏輯清晰、結構嚴謹&…

LabVIEW泵輪檢測

?在現代制造業蓬勃發展的浪潮下&#xff0c;汽車行業也迎來了高速發展期。液力變矩器作為實現車輛自動變速的關鍵零件產品&#xff0c;在汽車動力系統中扮演著不可或缺的角色。泵輪作為液力變矩器的核心組成部分&#xff0c;其生產質量直接影響著液力變矩器的性能。因此&#…

RT-DETRv2 中的坐標回歸機制深度解析:為什么用 `sigmoid(inv_sigmoid(ref) + delta)` 而不是除以圖像尺寸?

引言&#xff1a;一個看似簡單的公式&#xff0c;背后藏著工業級設計智慧 在閱讀 RT-DETRv2&#xff08;Real-Time DETR v2&#xff09;源碼時&#xff0c;我曾被一行代碼深深震撼&#xff1a; inter_ref_bbox F.sigmoid(bbox_head[i](output) inverse_sigmoid(ref_points_de…

簡單了解一下GraphRAG

傳統RAG的缺點 當我們將一段文本信息以句子分割后&#xff0c;存入到向量數據庫中。用戶提問“老王喜歡吃什么”&#xff0c;這個問題會與向量數據庫中的許多句子關聯性比較強&#xff0c;能返回準確且具體的信息。 但是&#xff0c;若是問題換成“出現了幾次西瓜”&#xff0c…

HTTP 狀態碼背后的邏輯:從請求到響應的完整流程解析(含完整流程圖)

在日常的 Web 開發與 API 調試中&#xff0c;我們經常會遇到各種 HTTP 狀態碼 ——404 Not Found、401 Unauthorized、500 Internal Server Error... 這些數字背后并非隨機出現&#xff0c;而是服務器處理請求過程中不同階段的 "反饋信號"。理解這些狀態碼的觸發邏輯…

Vue:下拉框多選影響行高

目錄 一、 出現場景二、 解決方案 一、 出現場景 在使用el-select增加multiple屬性進行多選時&#xff0c;會出現高度塌陷的情況 二、 解決方案 首先需要在el-select中增加collapse-tags屬性&#xff0c;并在style中增加如下樣式 方案一 <style scoped> ::v-deep .e…

如何在高通躍龍QCS6490 Arm架構上使用Windows 11 IoT企業版?

1.簡介研華已將高通躍龍QCS6490 技術應用于嵌入式模塊、單板電腦和AI攝像頭等各種規格的嵌入式硬件中。QCS6490平臺支持全面的操作系統生態系統&#xff0c;包括Windows、Ubuntu、Yocto和 Android。Windows 11 IoT企業版是微軟新一代的物聯網操作系統&#xff0c;具有更強的安全…

阿里云國際代理:如何利用RDS構建高可用、可擴展的數據庫架構

講下云數據庫RDS案例解析&#xff0c;若在上云或用云過程中有不懂的&#xff0c;可尋云樞國際yunshuguoji助力免卡上云用云。1、RDS MySQL數據庫代理支持讀寫分離、連接保持、就近訪問、事務拆分、連接池、SSL加密等功能&#xff0c;能夠降低主實例負載&#xff0c;提高實例可用…

C++之特殊類設計

文章目錄前言一、 設計一個不能被拷貝的類1. C98 實現方式2. C11 實現方式二、設計一個只能在堆上創建對象的類1. 方法一&#xff1a;析構函數私有&#xff0c;提供destory接口釋放資源2. 方法二&#xff1a;構造函數私有三、 設計一個只能在棧上創建對象的類1. 實現方式四、設…

TupiTube,一款免費開源的 2D 動畫創作工具

TupiTube&#xff0c;一款免費開源的 2D 動畫創作工具 ** ** 功能 ** &#xff1a;開源、免費的 2D 動畫軟件&#xff0c;界面簡單&#xff0c;支持逐幀動畫、剪紙動畫、定格動畫&#xff0c;能導入素材并導出多種視頻和圖片格式&#xff0c;適合兒童、學生和動畫愛好者入門創作…

MoE架構訓練系統設計:專家并行與門控網絡優化策略

點擊 “AladdinEdu&#xff0c;同學們用得起的【H卡】算力平臺”&#xff0c;注冊即送-H卡級別算力&#xff0c;80G大顯存&#xff0c;按量計費&#xff0c;靈活彈性&#xff0c;頂級配置&#xff0c;學生更享專屬優惠。 摘要 混合專家&#xff08;Mixture of Experts&#xf…

使用Python爬蟲,selenium和requests誰更強?

py爬蟲的話&#xff0c;selenium和reqeusts誰更強&#xff0c;selenium是不是能完全取代requests? 答案基本是可以的&#xff0c;selenium適合動態網頁抓取&#xff0c;因為它可以控制瀏覽器去點擊、加載網頁&#xff0c;requests則比較適合靜態網頁采集&#xff0c;它非常輕…

編譯原理-文法壓縮練習

這個任務的目標就是把一個給定的文法變得“干凈”和“高效”&#xff0c;剔除所有無用的部分。根據幻燈片&#xff0c;無用的&#xff08;多余的&#xff09;規則分為兩大類&#xff1a; 不可達規則&#xff1a;規則的“頭”&#xff08;左部非終結符&#xff09;從起始符號出發…

GPU硬件架構和配置的理解

從公司架構理解GPU架構想象一個GPU就像一家大型科技公司&#xff0c;它的任務是處理圖形和計算任務&#xff08;“干活”&#xff09;。硬件概念公司架構比喻作用和特點Platform (平臺)集團公司最大的獨立實體。比如谷歌Alphabet是一個集團公司&#xff0c;它旗下有谷歌、Waymo…

【硬件開發】電源抑制比PSRR

電源抑制比PSRR是電壓輸入量和電壓輸出量的比值&#xff0c;通常用dB來表示。 PSRR這個參數經常和運放&#xff0c;LDO,DCDC變換器有關聯。(2 封私信 / 58 條消息) 電源抑制比(PSRR)的基礎知識 - 知乎

七、卷積神經網絡

目錄 7.1 整體結構 7.2 卷積層 7.2.1 全連接層存在的問題 7.2.2 卷積運算 7.2.3 填充 7.2.5 3維數據的卷積運算 7.2.6 結合方塊思考 7.2.7 批處理 7.3 池化層 7.4 卷積層和池化層的實現 7.4.1 4維數組 7.4.2 基于 im2col的展開 7.4.3 卷積層的實現 7.4.4 池化層的…

加餐加餐!燒烤斗破蒼穹

忽然起了吃燒烤的念頭&#xff0c;便掏出手機點了一堆。不過二十分鐘&#xff0c;外賣小哥便按響了門鈴&#xff0c;手里提著一個方正的紙袋&#xff0c;還冒著熱氣。我將燒烤一一取出&#xff0c;排在茶幾上。肉串油光發亮&#xff0c;韭菜翠綠間點綴著蒜蓉&#xff0c;茄子剖…