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…