【C#學習筆記】屬性和字段

在這里插入圖片描述

文章目錄

  • 前言
  • 屬性和字段的區別
    • 字段
      • 訪問修飾符和關鍵字定義
      • 變量類型的定義
      • 變量命名
      • 變量的賦值
    • 屬性
  • 不同的使用情況


前言

最近在工作的過程中常常會覺得自己在程序設計方面的能力還是有欠缺。例如一直對于變量的聲明感到不足,在工作中為了圖方便總是直接public定義字段,實際上造成了很多困擾,特寫此文總結一下應當怎樣定義成員變量。

屬性和字段的區別

字段

【字段】

  • 字段(Field)是一種表示與對象或類關聯的變量的成員,字段聲明用于引入一個或多個給定類型的字段。字段是類內部用的,private類型的變量(字段),通常字段寫法都是加個"_"符號,然后聲明只讀屬性,字段用來儲存數據。
public int Index = 0;
private int m_index;
private static int s_index;
public static int s_Index;

字段,或者說變量是類中最基本的要素。一般來說我們定義一個字段的時候,需要考慮的是以下幾點:

  • 使用何種訪問修飾符
  • 是否使用其他關鍵字
  • 定義的變量類型
  • 變量名的取名
  • 變量在定義時的賦值

以上要素對于屬性定義也是一樣的。

訪問修飾符和關鍵字定義

這里這介紹一些常用的:

當我們希望一個字段可以被其他類訪問時,通常會將其定義為public,若不希望被其他類訪問,則為private,若想要被子類訪問,則會定義為protected

然后是一些關鍵字的運用:若想要即使生成了多個類,但其中的一些字段值依舊全局唯一,我們會使用static來定義。

如果我們想要對字段值在方法中進行類似指針的賦值引用,會用到ref,in,out關鍵字,或者直接進行指針引用(指針引用和C相同,但是必須要在unsafe塊中進行)。

ref,in,out的共同點是:

  • 需要在方法定義與方法調用處顯示的使用關鍵字。
  • 參數按引用傳遞,而非值傳遞。

ref,in,out的不同點是:

  • ref:參數變量需要初始化,參數在方法中可以修改或不修改。
  • out:參數變量無需初始化,參數在方法中必須進行賦值。
  • in:參數變量需要初始化,參數在方法中不能進行修改。

在類中實現方法的時候,我們還會用到abstract關鍵字,virutaloverride關鍵字。abstract用于抽象類中定義的抽象方法。而virutal定義了父類虛方法,override則用于繼承了該父類的子類中重寫同名虛方法和抽象方法。還有sealed關鍵字用來密封類或者函數,如果類使用了sealed則不可被繼承,若函數使用了override sealed來描述則該方法不可再被override重寫

關鍵字還有很多種,例如定義委托的delegate,基本語法的if,else,switch,case,break,continue,等等等等

變量類型的定義

定義的變量類型當然是需要什么定義什么,有些特殊的情況,例如我們在調用class類型的變量時,可以不定義為該class本身的類型:若需要訪問其父類中的方法,則可以直接定義為它的父類;若需要訪問該類中繼承的接口方法,也可以直接定義為它的接口類型。

變量命名

變量名的取名我通常是匈牙利命名法和駝峰命名法相結合:

  • 私有成員變量m_name,例如m_maxNum
  • 公共變量Name,例如MaxNum
  • 常量或宏NAME,例如MAX_NUM
  • 靜態變量s_開頭,結合公有或私有命名

雖然C#官方推薦私有變量_開頭,但是似乎許多宏也是_開頭的,為避免不必要的問題,我覺得不用以_開頭

從取名上盡量要取得詳細,除了一些專用名詞如TCP,UDP等等,盡量不要使用首字母大寫進行縮寫。例如一個TCP的接收消息管理器我會命名為TCP_ReceiveManager,或者一個游戲場景內物體管理器GameSceneObjManager。不要因為嫌麻煩而簡化命名

變量的賦值

一些變量在運行時需要提前進行初始化,否則會導致空引用,而一些變量雖然不賦值也可以調用,但往往會導致錯誤的結果。因此變量初始化的賦值很重要,要么在腳本開始執行時調用一個初始化方法統一分配,要么就直接在字段定義時進行賦值。


屬性

【屬性】

  • 屬性(Property)是另一種類型的類成員,定義屬性的目的是在于便于一些私有字段的訪問。類提供給外部調用時用的可以設置或讀取一個值,屬性則是對字段的封裝,將字段和訪問自己字段的方法組合在一起,提供靈活的機制來讀取、編寫或計算私有字段的值。屬性有自己的名稱,并且包含get 訪問器和set 訪問器。

屬性和字段的定義幾乎是一模一樣的,唯一的不同在于屬性提供了get訪問器和set訪問器。這使得我們可以在為屬性進行取值和賦值的時候定義一個自定義的方法。

屬性本質上可以看作是字段的一層封裝,它的內部包含了一個私有字段,并提供了一個get和set來讀寫這個私有字段,如下所示:

pulic class User
{private string m_name;//_name為字段public string Name   //Name為屬性,它含有代碼塊{get{return m_name;//讀取(返回_name值)}set {m_name= value;//為m_name賦值,value可以直接獲取賦值}}
}

所以為什么我們要多一層封裝而非直接將字段public出來呢?因為程序設計中我們不希望一個字段可以被其他類輕易的訪問,有時我們只想它可讀或者可寫,或者在讀寫時進行一些其他操作。如果不用屬性則需要定義讀寫的方法,顯然太麻煩了。

使用屬性,我們可以用get代表字段可讀,set代表可寫,以此控制字段的讀寫權限。同時屬性接口是只對外的(對內直接修改字段即可了),我們可以自定義訪問器的代碼,保證了外部修改的安全性。

所以我們才建議將字段作為類中的私有變量,屬性作為公共變量,通過屬性的設置,我們既可以靈活的定義讀寫字段時會發生什么事情,也可以很好的封裝字段以實現保護的目的。


不同的使用情況

公共字段:

  1. 允許自由讀寫
  2. 取值范圍只收數據類型約束而無其他任何特定限制;
  3. 值的變動不需要引發類中其它任何成員的相應變化;

如果滿足上述情況,則可以自由使用public 的字段,但是還是不建議使用

屬性:

  1. 要求字段只能讀或只能寫;
  2. 需要限定字段的取值范圍;
  3. 在改變一個字段的值的時候希望改變對象的其它一些狀態;

然而為什么我們建議使用屬性而非公共字段,從設計的耦合性和項目的可維護性來舉例,假如我們只是公開了這個字段,一旦我們想要修改這個字段的某些處理邏輯,那就必須對每一個引用了該字段的類中都進行處理。而使用屬性,我們則只需要設置get方法即可。

實際上屬性并不占用內存,只是用起來冗余一點,但是對于工程的提升是實打實的。

并且.net也提供了語法糖,我們只需定義屬性即可使用同名字段了(打出prop+回車 自動補全):

public int Index{ get; set; }

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

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

相關文章

聲音突破:so 索

小孩兒看完武俠劇,就決定從二樓往地面上跳,年輕的老媽看到了,就在那里罵,喝斥不準逞能,不許亂來,不許跳。但小孩子不聽話,心里全是影視劇的畫面,那叫一個俠之能也,于是飛…

llvm 常用命令備忘

執行 IR 上的指令合并優化 pass $ opt –S –instcombine testfile.ll –o output1.ll 執行無效參數優化 pass $ opt –S –deadargelim testfile.ll –o output2.ll C 語言生成 IR 文件 $ clang -emit-llvm -S multiply.c -o multiply.ll C 語言生成 IR 文件 $ clang -cc1 -…

面向長文本處理的鍵值緩存壓縮技術:智能壓縮,無損性能,免微調

隨著輸入長度的增加,大型語言模型(LLMs)中的鍵值(KV)緩存需要存儲更多的上下文信息以維持性能,這導致內存消耗和計算時間急劇上升。KV緩存的增長對內存和時間效率的挑戰主要表現在兩個方面:一是…

使用JavaScript實現網頁通知功能

如何使用js來實現網頁通知功能。即使在用戶瀏覽其他頁面時,也能向他們推送通知信息。 廢話不多說直接上代碼 function showAutoNotification() {if ("Notification" in window) {Notification.requestPermission().then(function(permission) {if (permis…

元宇宙數字藏品交易所,未來發展的大趨勢

隨著科技的飛速進步,元宇宙以其獨特的魅力為數字世界繪制了一幅前所未有的宏偉藍圖。在這一宏大的背景下,數字藏品交易所作為連接虛擬與現實的橋梁,正以其卓越的優勢,引領著數字藏品市場邁向新的高度。 首先,元宇宙為…

Vue 的服務端渲染(SSR)有哪些鉤子可以用

在 Vue 的服務端渲染(SSR)過程中,并不會執行完整的生命周期鉤子,只有一部分鉤子會在服務器端執行。以下是 Vue SSR 中支持的生命周期鉤子: beforeCreate:在實例初始化之后,數據觀測 (data obser…

【ARM Cache 與 MMU 系列文章 7.8 – ARMv8/v9 MMU Table 表分配原理及其代碼實現 2】

文章目錄 MMU Table 表分配原理及其代碼實現MMU Table 分配代碼實現MMU Table 表分配原理及其代碼實現 在做映射的時候所映射的地址范圍最大只能是某一級 level table 中 entry 所能支持的最大范圍,如果超過這個范圍需要在對應 level table 中新增一個entry,這里還是以映射虛…

【相關概念】經濟金融中的Momentum

張張張三豐de思考與總結: 最近做的期貨價格泡沫中,一直在說,momentum,momentum,momentum,那么究竟什么是momentum呢? 目前,在有關期貨價格泡沫的研究文獻中,一般都是研究…

本輪牛市新趨勢,跟隨The First捕捉牛市Alpha

與以往牛市“百花齊放”的繁榮景象相比,本輪牛市頗具獨特走勢,呈現出了資金集中度高、財富聚集效應小的特點,絕大部分加密資產甚至跑不贏BTC的漲幅幅度。而以往大放色彩的公鏈幣價值幣的走勢,甚至比不過牛尾才爆發的MEME幣。這使得…

Java項目之消息隊列(手寫java模擬實現mq)【三、MQ的核心類-消息類的存儲(用文件存儲消息)】? ★

Java項目之MQ 七. 消息存儲設計設計思路為什么要用文件存儲文件存儲結構queue_data.txt ?件格式:queue_stat.txt ?件格式: 創建 MessageFileManager 類定義一個內部類, 來表示該隊列的統計信息 Stat實現統計?件Stat讀寫(文本文件的讀寫)InputStream—…

python爬蟲入門教程(一)

上一篇文章講了爬蟲的工作原理,這篇文章以后就要重點開始講編程序了。 簡單爬蟲的的兩個步驟: 使用HTTPRequest工具模擬HTTP請求,接收到返回的文本。用于請求的包有: requests、urllib等。 對接收的文本進行篩選,獲取想要的內容。用戶篩選文…

JavaScript-內存分配,關鍵字const

內存空間 內存分為棧和堆 棧:由操作系統自動釋放存放的變量值和函數值等。簡單數據類型存放在棧中 棧會由低到高先入后出 堆:存儲引用類型 (數組,對象) 對象會先將數據存放在堆里面,堆的地址放在棧里面 關鍵…

【ArcGISProSDK】獲取要素中某字段最大值

public static async Task<double> GetMaxValueFromField(string vectorFilePath, string fieldName){double maxValue = 0;//矢量所在文件夾var filePath = System.IO.Path.GetDirectoryName(vectorFilePath);//矢量名稱var fileName = System.IO.Path.GetFileNameWitho…

VMD-PSO-LSTM單維時序預測模型(單輸入單輸出)-附代碼

VMD-PSO-LSTM單維時序預測模型&#xff08;單輸入單輸出&#xff09; 1&#xff09;首先對原始單維數據進行VMD分解&#xff0c;分解為K個模態分量和1個殘差分量 2&#xff09;將各個模態分量輸入模型&#xff0c;建立模型進行預測 3&#xff09;將各個預測結果相加得到最終…

clickhouse(十五、存儲優化實踐)

文章目錄 背景問題定位優化方式排序鍵設計寫入順序壓縮算法 DoubleDeltaLowCardinality避免使用Nullable 總結 背景 clickhouse集群容量告警&#xff0c;項目中某些表占據大量的存儲空間&#xff0c;借此機會對ck的存儲優化進行實踐學習&#xff0c;并通過多種方式測試驗證優化…

設計模式相關更新中

詳見gitee: 更新中? ??????設計模式相關: 設計模式相關介紹 (gitee.com) 一.面向對象的設計原則 二.單例模式

React(五)useEffect、useRef、useImperativeHandle、useLayoutEffect

(一)useEffect useEffect – React 中文文檔 useEffect hook用于模擬以前的class組件的生命周期&#xff0c;但比原本的生命周期有著更強大的功能 1.類組件的生命周期 在類組件編程時&#xff0c;網絡請求&#xff0c;訂閱等操作都是在生命周期中完成 import React, { Com…

算法題day37日(補5.23日卡:貪心算法day4)

一、刷題&#xff1a; 1.leetcode題目 860. 檸檬水找零 - 力扣&#xff08;LeetCode&#xff09;&#xff08;easy&#xff09;&#xff1a; 我覺得我寫的代碼有點蠢 class Solution:def lemonadeChange(self, bills: List[int]) -> bool:dict_ {5:0,10:0}if bills[0] !…

Python降維基礎知識:深入探索與實戰應用

Python降維基礎知識&#xff1a;深入探索與實戰應用 在數據分析和機器學習的廣闊領域中&#xff0c;降維技術一直扮演著重要的角色。Python&#xff0c;作為數據處理和機器學習的首選語言&#xff0c;為我們提供了豐富的降維工具和算法。本文將從四個方面、五個方面、六個方面…

算法訓練營第四十九天 | LeetCode 139單詞拆分

LeetCode 139 單詞拆分 基本還是完全背包的思路&#xff0c;不過用了三重循環&#xff0c;第三重循環是用于判斷當前字符串尾部指定長度字符是否和列表中某一字符串相同&#xff0c;是的話可以將當前dp[j]或上當前下標減去該單詞長度后的下標值。 代碼如下&#xff1a; clas…