C#語言入門詳解(17)字段、屬性、索引器、常量

C#語言入門詳解(17)字段、屬性、索引器、常量

  • 前言
  • 一、字段 Field
  • 二、屬性
  • 三、索引器
  • 四、常量


內容來自劉鐵猛C#語言入門詳解課程。
參考文檔:CSharp language specification 5.0 中文版
在這里插入圖片描述

前言

類的成員是靜態成員 (static member) 或者實例成員 (instance member)。 靜態成員屬于類, 實例成員屬于對象(類的實例) 。下表提供了類所能包含的成員種類的概述。

成員說明
常量與類關聯的常量值
字段類的變量
方法類可執行的計算和操作
屬性與讀寫類的命名屬性相關聯的操作
索引器與以數組方式索引類的實例相關聯的操作
事件可由類生成的通知
運算符類所支持的轉換和表達式運算符
構造函數初始化類的實例或類本身所需的操作
析構函數在永久丟棄類的實例之前執行的操作
類型類所聲明的嵌套類型

本節所講的字段、屬性、索引器、常量為類的四個成員。

一、字段 Field

在這里插入圖片描述

  • field原意為田地,在此處意指為數據存放空間。以Student類為例,包含ID、Name兩個字段,每個字段為4個字節。則Student的對象占8個字節,這8個字節分為兩塊田地,分別為ID、Name放不同的數據。

在這里插入圖片描述

  • 使用 static 修飾符聲明的字段定義靜態字段 (static field)。 一個靜態字段只標識一個存儲位置。無論對一個類創建多少個實例, 它的靜態字段永遠都只有一個副本,可用來表示類當前的狀態,即靜態字段的初始化在運行環境加載類時,后面不再初始化。聲明靜態字段時設置初始化值與在靜態構造器里面初始化靜態字段其實是一樣的。
  • 不使用 static 修飾符聲明的字段定義實例字段 (instance field)。 類的每個實例都為該類的所有實例字段創建一個單獨副本,每次創建實例都會初始化字段,實例字段的初始化在創建時。聲明實例字段時初始化值與在實例構造器里面初識化實例字段是一樣的。
  • readonly修飾的字段只有一次賦值機會,可在聲明時或構造器中賦值。
class Program
{static void Main(string[] args){var stuList = new List<Student>();for (int i = 0; i < 100; i++){var stu = new Student{Age = 24,Score = i,};stuList.Add(stu);}int totalAge=0;int totalScore=0;foreach (var stu in stuList){totalAge += stu.Age;totalScore += stu.Score;}//調用靜態字段,可直接使用 類.字段 的形式Student.AverageAge = totalAge / Student.Amout;Student.AverageScore = totalScore / Student.Amout;Student.ReportAmount();Student.ReportAverageAge();Student.ReportScore();}class Student{//普通字段public readonly int ID;public int Age;public int Score;//靜態字段//public、static為修飾符,修飾符在使用中最少使用一個,且必須是有意義的//訪問級別 static修飾符 變臉類型 成員名public static int AverageAge;public static int AverageScore;public static int Amout;// readonly修飾的字段只有一次賦值機會public Student(int id){this.ID = id;}public Student(){Amout++;}//靜態方法public static void ReportAmount(){Console.WriteLine(Amout);}public static void ReportAverageAge(){Console.WriteLine(AverageAge);}public static void ReportScore(){Console.WriteLine(AverageScore);}}
}

二、屬性

在這里插入圖片描述

  • 屬性為字段的包裝器,為避免字段被污染,需要對字段的賦值制定一定的規則,這個規則通過屬性來實現。
  • prop + 2 * TAB:屬性的簡略聲明
  • propfull + 2 * TAB:屬性的完整聲明
  • 使用 Get/Set 方法對之前:
class Program
{static void Main(string[] args){var stu1 = new Student(){Age = 20};var stu2 = new Student(){Age = 20};var stu3 = new Student(){// 非法值,污染字段Age = 200};var avgAge = (stu1.Age + stu2.Age + stu3.Age) / 3;Console.WriteLine(avgAge);}
}class Student
{public int Age;
}
  • 在C++/Java等編程語言中演化為 Get/Set 方法:
class Program
{static void Main(string[] args){try{var stu1 = new Student();stu1.SetAge(20);var stu2 = new Student();stu2.SetAge(20);var stu3 = new Student();stu3.SetAge(200);var avgAge = (stu1.GetAge() + stu2.GetAge() + stu3.GetAge()) / 3;Console.WriteLine(avgAge);}catch (Exception ex){Console.WriteLine(ex.Message);}}
}class Student
{private int age;public int GetAge(){return age;}public void SetAge(int value){if (value >= 0 && value <= 120){age = value;}else{throw new Exception("Age value has error.");}}
}
  • C++、JAVA 里面是沒有屬性的,使用 Get/Set 來保護字段的方法至今仍在 C++、JAVA 里面流行。因為 Get/Set 寫起來冗長,微軟應廣大程序員請求,給 C# 引入了屬性。
class Program
{static void Main(string[] args){try{var stu1 = new Student();stu1.Age=20;var stu2 = new Student();stu2.Age = 20;var stu3 = new Student();stu3.Age = 200;var avgAge = (stu1.Age + stu2.Age + stu3.Age) / 3;Console.WriteLine(avgAge);}catch (Exception ex){Console.WriteLine(ex.Message);}}
}class Student
{private int age;public int Age{get{return age;}set{if (value >= 0 && value <= 120){age = value;}else{throw new Exception("Age value has error.");}}}
}
  • 動態計算值的屬性。主動計算,每次獲取 CanWork 時都計算,適用于 CanWork 屬性使用頻率低的情況。
class Program
{static void Main(string[] args){try{var stu1 = new Student();stu1.Age = 12;Console.WriteLine(stu1.CanWork);}catch (Exception ex){Console.WriteLine(ex.Message);}}
}class Student
{private int age;public int Age{get { return age; }set{age = value;}}public bool CanWork{get{return age > 16;}}
}
  • 被動計算,只在 Age 賦值時計算一次,適用于 Age 屬性使用頻率低,CanWork 使用頻率高的情況。
class Program
{static void Main(string[] args){try{var stu1 = new Student();stu1.Age = 12;Console.WriteLine(stu1.CanWork);}catch (Exception ex){Console.WriteLine(ex.Message);}}
}class Student
{private int age;public int Age{get { return age; }set{age = value;CalculateCanWork();}}private bool canWork;public bool CanWork{get { return canWork; }}private void CalculateCanWork(){canWork = age > 16;}
}
  • 建議:永遠使用屬性(而不是字段)來暴露數據,即字段永遠是 private 或 protected 的。 字段只在類內部使用,類之間交換數據,永遠只用屬性。

三、索引器

在這里插入圖片描述

  • indexer + 2 * TAB:快速聲明索引器
  • 索引器一般用于集合中,下面示例僅為展示,一般很少用在非集合中。
class Program
{static void Main(string[] args){var stu = new Student();stu["Math"] = 90;stu["Math"] = 100;var mathScore = stu["Math"];Console.WriteLine(mathScore);}
}class Student
{//鍵值對,string為科目名稱,int為socreprivate Dictionary<string, int> scoreDictionary = new Dictionary<string, int>();public int? this[string subject]{get{if (scoreDictionary.ContainsKey(subject)){return scoreDictionary[subject];}else{return null;}}set{if (value.HasValue == false){throw new Exception("Score cannot be null");}if (scoreDictionary.ContainsKey(subject)){//  可空類型的 Value 屬性才是其真實值。scoreDictionary[subject] = value.Value;}else{scoreDictionary.Add(subject, value.Value);}}}
}

四、常量

在這里插入圖片描述

  • 示例為第四種場景:類不可以用作常量,需使用靜態只讀字段
class Program
{static void Main[string[] args){Console.WriteLine[WASPEC.WebsiteURL);}
}class WASPEC
{public const string WebsiteURL = "http://www.waspec.org";//類 不能用作常量//public const Building Location = new Building[) { Address = "Some Address” };public static readonly Building Location = new Building("Some Address")
class Building}class Building
{public Building[string address){this.Address = address;}public string Address { get; set; }
}

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

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

相關文章

Total PDF Converter多功能 PDF 批量轉換工具,無水印 + 高效處理指南

在辦公場景中&#xff0c;PDF 格式的 “不可編輯性” 常成為效率瓶頸 —— 從提取文字到格式轉換&#xff0c;從批量處理到文檔加密&#xff0c;往往需要多款工具協同。Total PDF Converter 破解專業版作為一站式 PDF 解決方案&#xff0c;不僅支持 11 種主流格式轉換&#xff…

[Windows] WPS官宣 64位正式版(12.1.0.22525)全新發布!

[Windows] WPS官宣 64位正式版 鏈接&#xff1a;https://pan.xunlei.com/s/VOYepABmXVfXukzlPdp8SKruA1?pwdeqku# 自2024年5月&#xff0c;WPS 64位版本在WPS社區發布第一個內測體驗安裝包以來&#xff0c;在近一年多的時間里&#xff0c;經過超過3萬名WPS體驗者參與版本測試…

WinExec

函數原型&#xff1a; __drv_preferredFunction("CreateProcess","Deprecated. See MSDN for details") WINBASEAPI UINT WINAPI WinExec(__in LPCSTR lpCmdLine,__in UINT uCmdShow); preferred : 更好的 __drv_preferredFunction("CreateProcess…

基于GA遺傳優化的雙向LSTM融合多頭注意力(BiLSTM-MATT)時間序列預測算法matlab仿真

目錄 1.前言 2.算法運行效果圖預覽 3.算法運行軟件版本 4.部分核心程序 5.算法仿真參數 6.算法理論概述 7.參考文獻 8.算法完整程序工程 1.前言 時間序列預測是機器學習領域的重要任務&#xff0c;廣泛應用于氣象預報、金融走勢分析、工業設備故障預警等場景。傳統時間…

Multi-Head RAG: Solving Multi-Aspect Problems with LLMs

以下是對論文《Multi-Head RAG: Solving Multi-Aspect Problems with LLMs》的全面解析&#xff0c;從核心問題、方法創新到實驗驗證進行系統性闡述&#xff1a;??一、問題背景&#xff1a;傳統RAG的局限性??傳統檢索增強生成&#xff08;RAG&#xff09;在處理??多維度復…

Jenkins 全方位指南:安裝、配置、部署與實戰應用(含圖解)

一、Jenkins 安裝 1.1 系統要求 基礎環境&#xff1a;Java 8 或 Java 11&#xff08;推薦&#xff09;、至少 2GB 內存、10GB 以上磁盤空間 支持系統&#xff1a;Windows、Linux&#xff08;Ubuntu/CentOS&#xff09;、macOS 網絡端口&#xff1a;默認使用 8080 端口&…

以國產IoTDB為代表的主流時序數據庫架構與性能深度選型評測

> &#x1f4a1; 原創經驗總結&#xff0c;禁止AI洗稿&#xff01;轉載需授權 > 聲明&#xff1a;本文所有觀點均基于多個領域的真實項目落地經驗總結&#xff0c;數據說話&#xff0c;拒絕空談&#xff01; 目錄 引言&#xff1a;時序數據庫選型的“下半場” 一、維…

7.2elementplus的表單布局與模式

基礎表單<template><el-form ref"ruleFormRef" :model"form" :rules"rules" label-width"100px"><el-form-item label"用戶名" prop"username"><el-input v-model"form.username"…

PyTorch實戰(3)——PyTorch vs. TensorFlow詳解

PyTorch實戰&#xff08;3&#xff09;——PyTorch vs. TensorFlow詳解0. 前言1. 張量2. PyTorch 模塊2.1 torch.nn2.2 torch.optim2.3 torch.utils.data3. 使用 PyTorch 訓練神經網絡小結系列鏈接0. 前言 PyTorch 是一個基于 Torch 庫的 Python 機器學習庫&#xff0c;廣泛用…

在win服務器部署vue+springboot + Maven前端后端流程詳解,含ip端口講解

代碼打包與基本配置 首先配置一臺win系統服務器&#xff0c;開放你前端和后端運行的端口&#xff0c;如80和8080 前端打包 前端使用vue3&#xff0c;在打包前修改項目配置文件&#xff0c;我使用的是vite所以是vite.config.js。 import { defineConfig } from vite import …

Springcloud-----Nacos

一、Nacos的安裝 Nacos是阿里推出的一種注冊中心組件&#xff0c;并且已經開源&#xff0c;目前是國內最為流行的注冊中心組件。下面我們來了解一下如何安裝并啟動Nacos。 Nacos是一個獨立的項目&#xff0c;我們可以去GitHub上下載其壓縮包來使用&#xff0c;地址如下&#x…

騰訊云重保流程詳解:從預案到復盤的全周期安全防護

摘要 騰訊云針對國家級重大活動&#xff08;如進博會、冬奧會等&#xff09;提供的網絡安全保障服務&#xff08;重保&#xff09;是一套系統化的主動防御體系。本文從“事前準備”“事中響應”“事后復盤”三個核心階段出發&#xff0c;結合民生銀行等典型用戶的實戰案例&…

單表查詢-group by rollup優化

1、group by rollup基本用法 我們有時候在項目上看到group by rollup用法&#xff0c;其實就是對group by分組進行合計。 下面看一下例子 select count(1),c3 from t1 group by rollup(c3); 計劃從計劃中解讀亦是如此&#xff0c;另外可以從結果上進行分析第21行的count其實就是…

云網絡(參考自騰訊云計算工程師認證)

計算機網絡&#xff1a;OSI七層模型&#xff1a; 應用層&#xff1a;負責處理網絡應用程序之間的通信、 表示層&#xff1a;負責數據的格式化和加密、 會話層&#xff1a;負責建立、管理和終止會話、 傳輸層&#xff1a;負責端到端的可靠傳輸、 網絡層&#xff1a;負責數據的路…

【MLLM】多模態理解Ovis2.5模型和訓練流程(更新中)

note 模型架構&#xff1a;延續 Ovis 系列創新的結構化嵌入對齊設計。 Ovis2.5 由三大組件構成&#xff1a;動態分辨率 ViT 高效提取視覺特征&#xff0c;Ovis 視覺詞表模塊實現視覺與文本嵌入的結構對齊&#xff0c;最后由強大的 Qwen3 作為語言基座&#xff0c;處理多模態嵌…

mysql中的通用語法及分類

MySQL 是一種廣泛使用的關系型數據庫管理系統&#xff08;RDBMS&#xff09;&#xff0c;其語法設計遵循 SQL 標準&#xff0c;但也有一些特有的擴展。以下從??通用語法規范??和??SQL 語句分類??兩個維度系統梳理 MySQL 的核心語法體系。一、MySQL 通用語法規范通用語法…

Linux-搭建NFS服務器

Linux-搭建NFS服務器前言一、網絡配置二、在nfs服務器上安裝nfs-utils軟件包三、設置共享目錄四、掛載NFS共享目錄前言 NFS&#xff08;Network File System&#xff0c;網絡文件系統&#xff09; 是一種分布式文件系統協議&#xff0c;最初由 Sun Microsystems 于 1984 年開發…

eslasticsearch+ik分詞器+kibana

eslasticsearch 下載地址:https://www.elastic.co/cn/downloads/past-releases ik分詞器 下載地址&#xff1a;https://release.infinilabs.com/analysis-ik/stable/ kibana 下載地址&#xff1a;https://www.elastic.co/cn/downloads/kibana 1、解壓安裝包 將下載的 zi…

SOME/IP-SD IPv4組播的通信參數由誰指定?

<摘要> 在AUTOSAR SOME/IP-SD協議中&#xff0c;組播通信參數&#xff08;地址、協議、端口&#xff09;的協商機制。其核心在于明確規定了組播流的發布者和接收者之間由誰來“指定”通信路徑&#xff0c;從而確保雙方能夠成功會合&#xff0c;實現高效的一對多事件分發。…

新手首次操作SEO核心要點

內容概要 初次接觸SEO的新手朋友們&#xff0c;面對浩瀚的網絡優化知識&#xff0c;難免感到無從下手。這份2025年的零基礎入門指南&#xff0c;正是為你們量身打造。它清晰地規劃了學習路徑&#xff0c;從最基礎的網站搭建注意事項開始&#xff0c;幫助你避開常見陷阱&#xf…