c# 字段和属性(get、set、init)

目录

基本概念:

个人理解:

访问器的默认写法:

set与init无法共存:

init:

必须在类的实例化时给字段赋值的情况(require属性):


基本概念:

  • “字段”就是类内成员变量,一般为了隐藏数据,保护数据,实现对外不可见,体现封装的思想,成员变量都声明为私有变量;
  • “属性”是类内的一种成员,它是一种特殊的方法(方法的意思和函数差不多意思),被称为“访问器”,专门用于处理私有字段的访问和赋值(字段就是成员变量);
  • “get、set、 init”在属性的内部,体现访问器的类型;如果属性包含get、set那么就是读-写访问器(也叫读写属性),如果只有get,那么就是只读访问器(也叫只读属性);只有set是只写访问器(也叫只读属性);init访问器比较特殊,要求类在初始化时设置字段的值,而且init会在初始化后强制字段不可再更改,就是初始设置字段的值后就不能再用set给字段赋值,值得注意的是set与init访问器无法同时存在属性中;

个人理解:

访问器用来安全地操作私有成员变量。

虽然可以用类内公有函数实现私有变量地获取(这是一般用来获取和修改私有成员变量地方法),但是相较于访问器来说,过于繁琐;

微软文档是这样描述:

属性是一种成员,它提供灵活的机制来读取、写入或计算私有字段的值。 属性可用作公共数据成员,但它们是称为“访问器”的特殊方法。 此功能使得可以轻松访问数据,还有助于提高方法的安全性和灵活性。

总的来说,访问器就是访问私有成员变量的公开成员函数的优化版;


自动属性:

类内属性和字段的一般形式 :

如果没有特殊需求,比如不想在get内实现一些特殊需求,只是想要获取私有变量的值,用默认写法方便快捷(set,init同样有默认写法);

上面的程序等效于:

很多工程源码都会使用这种访问器的默认写法;

注意,访问器的默认写法对字段名和属性名有严格要求;

字段的命名要求第一个单词的首字母小写,后面单词的首字母大写;(骆驼命名法 Camel)

属性的命名要求每个单词的首字母大写;

骆驼命名法(Camel Case)是一种命名约定,其中多个单词组合在一起,并且每个单词的首字母大写,除了第一个单词的首字母通常小写。这种命名风格的名称源自单词之间的大写字母形状看起来像骆驼的驼峰。

例如,在骆驼命名法中:

- `myVariable`
- `calculateTotalAmount`
- `getUserInfo`

这些都是使用骆驼命名法的示例。这种命名风格在许多编程语言中广泛使用,包括Java、C#、JavaScript等。在编写代码时,采用一致的命名风格可以增加代码的可读性,并使代码库更易于维护。

另外:自动属性其实是一个语法糖。

语法糖:用更简介的代码替换原本复杂的代码,前后效果不变;

例如:三元运算符"?"

d=a?b:c;

等价替换:

if(a) d=b;

else d=c;

注意:自动属性只能获取简单的数据类型(int,float,boll等字段),不能获取复杂类型(自己实现的类);

自动属性赋上默认值:

C#6.0和C#6.6之后

从6.0开始可以支持直接给自动属性设置默认值,具体语法如下,

class Person 
{public Person(){}public string Name { get; set; } = "Default Name";
}


set与init无法共存:

在属性中同时实现set和init会报错:属性访问器已经定义

可能就是因为init后无法再给字段赋值也就不能调用set;


init:

可以在类的初始化时给字段赋值,也可以不赋值。

在类的初始化时,不给字段赋值:

在类的初始化时,给字段赋值:

注意:当要在初始化时给字段赋值时,要在花括号内实现;


required:

必须在类的实例化时给字段赋值的情况(require属性):

官方文档里的原文内容:

必需的属性

C# 11 开始,可以添加 required 成员以强制客户端代码初始化任何属性或字段:

C#复制

public class SaleItem
{public required string Name{ get; set; }public required decimal Price{ get; set; }
}

若要创建 SaleItem,必须使用对象初始值设定项设置 Name 和 Price 属性,如以下代码所示:

C#复制

var item = new SaleItem { Name = "Shoes", Price = 19.95m };
Console.WriteLine($"{item.Name}: sells for {item.Price:C2}");

 unity2022(LTS)支持c#9.0版本,无法使用required;

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

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

相关文章

“一键调整尺寸,轻松完成视频批量剪辑:批量放大视频尺寸“

你是否曾经遇到过需要批量调整视频尺寸的情况?无论是为了适应不同的播放平台,还是为了满足客户的特定需求,批量调整视频尺寸都是一项繁琐而耗时的工作。但是,现在有一种方法可以让你轻松完成这项任务,那就是使用我们的…

ABAP与HANA集成:HANA视图转换为ABAP字典视图

使用场景 最近项目在用HANA开发逻辑,形成了很多过程的计算视图,一般我们BW人员可能直接用计算视图出具前端报表,或者链接到cp使用,没有考虑转换成abap字典视图,也就是前台SE11能查到的视图,但是非开发人员…

PPT插件-好用的插件-放映笔、绘图板-大珩助手

放映笔 幻灯片放映时,工具在幻灯片的左下方,本工具在幻灯片的右侧,可以移动,可以方便在右侧讲课时候使用 绘图板 可在绘图板上写签名、绘制图画、写字等等,点画笔切换橡皮擦,点插入绘图,将背景…

RK3568平台(网络篇) 有线网络基本概念及测试手法

一.什么是交换机? 交换机是一种用于电(光)信号转发的网络设备。它可以为接入交换机的任意两个网络节点提供独享的电信号通路。最常见的交换机是以太网交换机。交换机工作于OSI参考模型的第二层,即数据链路层。交换机拥有一条高带宽的背部总线和内部交换…

Leetcode—78.子集【中等】

2023每日刷题&#xff08;五十九&#xff09; Leetcode—78.子集 算法思想 实现代码 class Solution { public:vector<vector<int>> subsets(vector<int>& nums) {int len nums.size();vector<int> path;vector<vector<int>> ans;f…

24年五年制专转本招生院校有可能发生变动

据悉&#xff0c;24年五年制专转本院校可能将发生改变&#xff0c;南京传媒学院有可能停止招生 将新增一所招生大学&#xff1a;南京航空航天大学金城学院 南京航空航天大学金城学院始建于1999年&#xff0c;是南京航空航天大学联合社会力量创办的独立学院。学校位于江苏省南京…

HPM6750系列--第八篇 Segger Embedded Studio for RISC-V查看外设寄存器

一、目的 在博客《HPM6750系列--第五篇 使用Segger Embedded Studio for RISC-V开发环境》中我们详细介绍了在SES中进行开发调试的相关步骤&#xff0c;但是在调试过程中发现未找到外设寄存器窗口&#xff0c;本篇就此问题指导大家进行设置查看寄存器信息。 二、介绍 请务必先阅…

使用python做一个实用的工具,便捷的定位和操作文档

环境准备&#xff1a;totalcommander 我用的totalcommander&#xff0c;python脚本的快捷键也是在totalcommander中注册的&#xff0c;所以需要先在TC界面下&#xff0c;才能通过预定义的快捷键唤起 python 脚本。以下是我的 totalCommander界面&#xff0c;我定义的快捷键是 …

freeRtos互斥量的使用

所以二进制并不能保证是谁上锁谁解锁&#xff0c;引入互斥量本质并没有解决这个问题&#xff0c;还是要程序员去解决。引入互斥量可以去解决优先级翻转的问题。 一.优先级反转和优先级继承 二. 递归上锁 获得了锁之后&#xff0c;再次执行任务获得锁。 三.创建互斥量 与前面…

Axure的动态图使用以及说明

认识Axure动态图 Axure动态图是Axure中的一种功能&#xff0c;它允许用户在原型中添加动画效果和交互动作&#xff0c;使原型更加生动和具有真实的用户体验。用户可以通过添加动态图来展示页面过渡、按钮点击、下拉菜单等交互操作的效果。 这是&#xff1a;就是我们今天要叫的…

mysql原理--B+树索引

1.没有索引的查找 1.1.在一个页中的查找 (1). 以主键为搜索条件 可以在 页目录 中使用二分法快速定位到对应的槽&#xff0c;然后再遍历该槽对应分组中的记录即可快速找到指定的记录。 (2). 以其他列作为搜索条件 这种情况下只能从 最小记录 开始依次遍历单链表中的每条记录&am…