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

基本概念:

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

个人理解:

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

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

微软文档是这样描述:

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

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


访问器的默认写法:

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

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

上面的程序等效于:

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


set与init无法共存:

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

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

init:

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

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

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

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


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

官方文档里的原文内容:

必需的属性

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

C#复制

复制代码
public class SaleItem
{
    public required string Name
    { get; set; }

    public required decimal Price
    { get; set; }
}

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

C#复制

复制代码
var item = new SaleItem { Name = "Shoes", Price = 19.95m };
Console.WriteLine($"{item.Name}: sells for {item.Price:C2}");
相关推荐
大飞pkz1 小时前
【设计模式】题目小练2
开发语言·设计模式·c#·题目小练
csdn_aspnet3 小时前
MongoDB C# .NetCore 驱动程序 序列化忽略属性
mongodb·c#·.netcore
浪扼飞舟3 小时前
c#基础二(类和对象,构造器调用顺序、访问级别、重写和多态、抽象类和接口)
java·开发语言·c#
SmalBox4 小时前
【光照】Unity[经验模型]和[物理模型]
unity·渲染
好望角雾眠7 小时前
第四阶段C#通讯开发-1:通讯基础理论,串口,通讯模式,单位转换,代码示例
开发语言·笔记·c#·串口·通讯
在路上看风景7 小时前
10. 游戏开发中的TCP与UDP
unity
陈言必行7 小时前
Unity 性能优化 之 静态资源优化 (音频 | 模型 | 纹理 | 动画)
unity·性能优化·游戏引擎
薄荷撞~可乐14 小时前
C#Task(Api)应用
开发语言·c#
Thomas_YXQ17 小时前
Unity3D RectTransform.rect属性详解
unity·编辑器·游戏引擎·材质
平行云17 小时前
赋能数字孪生:Paraverse平行云实时云渲染平台LarkXR,提供强大的API与SDK用于二次开发和深度集成
3d·unity·ue5·webgl·实时云渲染·云xr