C#:第一性原理拆解属性(property)

目录

第一步:从最基本的需求出发

第二步:引入控制需求

第三步:优化访问方式

第四步:剖析属性的本质

第五步:进一步简化和演化

第六步:总结属性的第一性原理

我们用第一性原理(First Principles)来拆解和理解 C# 中的“属性”(Properties)。

第一步:从最基本的需求出发

在编程中,我们需要处理数据。假设我们有一个对象,比如一个表示“人”的类:

  • 这个“人”有名字(Name)和年龄(Age)等信息。

  • 我们需要一种方式来存储这些信息,并且能够访问和修改它们。

最简单的方法是直接用字段(Field):

public class Person {public string name;public int age;
}

这样可以用 person.name = "Alice"; 或 int currentAge = person.age; 来操作数据。但这有个问题:字段是完全公开的,任何代码都可以随意读写,没有控制。 

第二步:引入控制需求

假设我们希望:

  1. 保护数据:不让外部直接修改字段(封装性)。

  2. 增加逻辑:比如验证年龄不能是负数,或者在读取名字时总是返回大写形式。

为了实现这个控制,我们可以用私有字段(private field)加上方法(getter 和 setter):

public class Person {private string name;private int age;public string GetName() {return name.ToUpper(); // 返回大写名字}public void SetName(string value) {name = value; // 简单赋值}public int GetAge() {return age;}public void SetAge(int value) {if (value >= 0) // 验证逻辑age = value;}
}

这样我们通过方法控制了对 name 和 age 的访问。但问题来了:

  • 写起来很繁琐,每个字段都需要两个方法。

  • 使用时不够直观,要写 person.SetAge(25) 而不是 person.age = 25。

第三步:优化访问方式

从第一性原理看,我们想要:

  1. 字段的简洁语法(像 person.age = 25 这样直接赋值)。

  2. 方法的控制能力(能在赋值或取值时加逻辑)。

C# 的设计者观察到这个需求,提出了“属性”(Properties)作为解决方案。属性本质上是字段访问的“语法糖”,背后是对 getter 和 setter 方法的封装。我们可以用属性改写上面的代码:

public class Person {private string name;private int age;public string Name {get { return name.ToUpper(); }set { name = value; }}public int Age {get { return age; }set { if (value >= 0) age = value; }}
}

现在可以用 person.Name = "Alice"; 和 int currentAge = person.Age; 来操作,语法简洁,同时保留了逻辑控制。 

第四步:剖析属性的本质

从底层看,属性不是字段,而是编译器生成的一对方法:

  • get_Name():取值时调用。

  • set_Name(string value):赋值时调用,value 是关键字,表示传入的值。

编译器把属性翻译成这样的方法调用,但让我们用字段的语法来访问。这是一种折中:

  • 形式上像字段,方便使用。

  • 本质上是方法,提供灵活性。

可以用 IL 反编译工具(比如 ILSpy)验证:属性会被编译成 get_XXX 和 set_XXX 方法。

第五步:进一步简化和演化

如果属性只是简单地读写字段,没有额外逻辑,C# 提供了自动属性(Auto-Implemented Properties):

public class Person {public string Name { get; set; }public int Age { get; set; }
}

这里:

  • 编译器自动生成一个私有字段(通常命名为 <Name>k__BackingField)。

  • 自动生成 getter 和 setter。

这进一步减少了代码量,但仍然保留了属性作为“接口”的本质。如果你以后需要加逻辑,可以直接扩展:

public int Age {get { return age; }set { if (value >= 0) age = value; }
}

第六步:总结属性的第一性原理

从最基本的需求出发,C# 的属性是为了解决以下问题:

  1. 数据封装:通过私有字段隐藏实现细节。

  2. 访问控制:通过 getter 和 setter 提供逻辑。

  3. 语法简洁:让开发者用类似字段的方式操作对象。

属性不是凭空发明的,而是基于“数据 + 行为”的基本编程需求,结合“简洁性 + 灵活性”的设计目标演化而来。它是字段和方法的“中间态”,既不是单纯的存储,也不是完全的方法,而是一种更高层次的抽象。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/73876.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

-PHP 应用文件上传函数缺陷条件竞争二次渲染黑白名单JS 绕过

#学习前必读&#xff1a; 1 、课前一定要明白&#xff1a; 无文件解析安全问题上&#xff0c;格式解析是一对一的&#xff08;不能 jpg 解析 php &#xff09; 换句话来说有解析错误配置或后缀解析漏洞时才能实现格式差异解析 2 、文件上传安全指的是攻击者通过利用上传…

C++的模板(十四):更多的自动内存管理

在前文《C的模板(八)&#xff1a;子系统》class DMM&#xff0c;给出了一个自动动态内存管理的例子。https://blog.csdn.net/aaasssdddd96/article/details/139921880 它使用了一个list容器&#xff0c;把两个类型兼容的指针存放在一起。在new的时候&#xff0c;随即就把得到的…

Windows下VSCode的安装

前言 VSCode的安装看起来平平无奇&#xff0c;但也不是轻轻松松的。笔者将最新的Windows下安装VSCode&#xff0c;以及运行最简单的C程序的过程记录下来&#xff0c;供后续的自己和大家参考。 一、官网下载安装包 Visual Studio Code - Code Editing. Redefined 二、安装 直接…

Matlab教程004:Matlab矩阵的拼接重构重排以及矩阵的运算

文章目录 1.4.3 矩阵的拼接重构重排1.4.3.1 横向拼接1.4.3.2 纵向拼接1.4.3.3 矩阵的重构重排 1.4.4 矩阵的运算1.4.4.1 算数运算1.4.4.2 矩阵加减1.4.4.3 矩阵乘法1.4.4.4 矩阵转置 1.4.3 矩阵的拼接重构重排 1.4.3.1 横向拼接 A和B的行数相同&#xff0c;那么使用[A,B]、[A …

Python小练习系列 Vol.3:生成有效括号组合(回溯 + DFS)

&#x1f9e0; Python小练习系列 Vol.3&#xff1a;生成有效括号组合&#xff08;回溯 DFS&#xff09; &#x1f44b; 本期我们来刷一道 LeetCode 热门经典题&#xff0c;借此掌握回溯算法的精髓 —— 生成有效括号组合&#xff0c;是学习递归 & DFS 的黄金题型&#xff…

实战经验深度解析 | 博睿数据制造行业精选案例集发布!

近年来&#xff0c;我国制造业加速迈向高端化、智能化、绿色化&#xff0c;为经济高质量发展注入新动能。放眼全球&#xff0c;制造业正加速数字化、智能化转型&#xff0c;5G、人工智能、边缘计算等技术与生产全流程深度融合&#xff0c;有力推动柔性化生产与产业链协同创新发…

[创业之路-344]:战略的本质是选择、聚焦, 是成本/效率/低毛利优先,还是差易化/效益/高毛利优先?无论是成本优先,还是差易化战略,产品聚焦是前提。

前言&#xff1a; 一、战略的本质是选择、聚焦 关于战略的本质&#xff0c;触及了商业竞争的核心矛盾&#xff1a;选择成本优先&#xff08;效率/低毛利&#xff09;还是差异化&#xff08;效益/高毛利&#xff09;&#xff0c;本质上是对企业战略方向的终极拷问。 1、战略选…

项目代码第10讲【数据库运维知识——如何优化数据库查询效率?】:各种日志查看;主从复制;分库分表(MyCat);读写分离;区别数据分区、分表、分库

01. 运维-课程介绍_哔哩哔哩_bilibili 一、各种日志查看 二、主从复制 三、分库分表&#xff08;MyCat&#xff09; 四、读写分离 五、区别数据分区、分表、分库 1、数据库分区 上图中的ibd文件&#xff0c;是分区表的数据文件&#xff0c;可以分布在不同的物理设备上&…

OpenCV图像拼接(10)用于实现图像拼接过程中的时间流逝(timelapse)效果的一个类cv::detail::Timelapser

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 cv::detail::Timelapser 是 OpenCV 库中用于实现图像拼接过程中的时间流逝&#xff08;timelapse&#xff09;效果的一个类。它通常用于将一系列…

Transformer 通关秘籍2:利用 BERT 将文本 token 化

前面两节分别通过两个代码示例展示了模型将文本转换为 token 之后是什么样的&#xff0c;希望你可以对此有一个感性的认识。 本节来简要介绍一下将一个连续的文本转换为 token 序列的大致过程&#xff0c;这个过程被称为分词&#xff0c;也叫 tokenization。 在你没了解这方面…

Optional的stream方法,flatMap, filter应用

Java 8引入的Optional和Stream彻底改变了我们处理空值和集合操作的方式。本文将深入探讨如何将二者结合使用&#xff0c;通过四个核心场景提升代码的健壮性和简洁性。 一、Optional构成的Stream&#xff1a;空值自动过滤 当处理Optional集合时&#xff0c;我们常需要过滤掉空…

参加李继刚线下活动启发:未来提示词还会存在吗?

上周六&#xff0c;我参加了李继刚老师组织的线下活动。 现场干货满满&#xff0c;尤其是关于 AI 时代提示词的价值、与 AI 沟通的艺术等话题&#xff0c;李老师的分享如同醍醐灌顶&#xff0c;让我对 AI 人机协作有了更深的理解。 将几点核心收获整理出来&#xff0c;与大家…

Python基础知识第二天:从格式化到流程控制

Python基础知识第二天&#xff1a;从格式化到流程控制 大家好&#xff01;今天我们来梳理Python的一些重要基础知识&#xff0c;包括格式化输出、输入函数、运算符以及流程控制语句。 1. 格式化输出 Python提供了多种格式化输出的方式&#xff1a; # %d, %f, %s 格式化name &q…

GDB: coredump

前言&#xff1a;一句话如下使用 gdb [exec_file] [core_file] # or gdb -c [core_file] [exec_file] #-c指定转储的core文件 gdb -c core.5213 spp_uc_frequent_contact_ol_worker # 进入后输入bt查看调用栈 bt #显示所有帧栈 bt 10 #显示前面10个帧栈(感觉没啥用) bt …

21_js正则_表单验证

目录 正则 一、 正则的概念 二、创建正则方式 2.1 构造函数去创建正则 2.2 字面量去创建正则 2,3 test方法 三、正则修饰符 四、 正则的方法 lastIndex test方法 exec 五、字符串方法 replace match search split 六、正则表达式的构成 元字符-- 定位符 元字…

矿山自动化监测解决方案

1.行业现状 为贯彻落实《中共中央国务院关于推进安全生产领域改革发展的意见》《“十四五”矿山安全生产规划》&#xff08;应急〔2022〕64号&#xff09;、《国务院安委会办公室关于加强矿山安全生产工作的紧急通知》&#xff08;安委办〔2021〕3号&#xff09;等有关工作部署…

企业级知识库建设:自建与开源产品集成的全景解析 —— 产品经理、CTO 与 CDO 的深度对话

文章目录 一、引言二、主流产品与方案对比表三、自建方案 vs. 开源产品集成&#xff1a;技术路径对比3.1 自建方案3.2 开源产品集成方案 四、结论与个人观点 一、引言 在当今数据驱动的商业环境中&#xff0c;构建高质量的知识库已成为企业数字化转型的关键一环。本博客分别从…

【蓝桥杯】单片机设计与开发,温度传感器DS18B20

一、温度传感器概述 结构图 二、通信过程 三、onewire单总线协议概述 四、单总线的工作原理 黑粗线是单片机发送的&#xff0c;浅的是s18b20回应的 五、温度传感器的应用 六、onewire 七、课后习题

Python 在Word中查找并替换文本

在操作Word文档时&#xff0c;如果想要修正一处反复出现的拼写错误&#xff0c;统一文中前后不一致的术语&#xff0c;或者将文档中所有的旧联系方式更新为新号码。这时我们可以使用 Word中的查找替换功能&#xff0c;快速定位并批量处理文档中的特定文本&#xff0c;提升编辑效…

Python 笔记 (二)

Python Note 2 1. Python 慢的原因2. 三个元素3. 标准数据类型4. 字符串5. 比较大小: 富比较方法 rich comparison6. 数据容器 (支持*混装* )一、允许重复类 (list、tuple、str)二、不允许重复类 (set、dict)1、集合(set)2、字典(dict)3、特殊: 双端队列 deque 三、数据容器的共…