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;茄子剖…