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

2023-12-14 17:35:11

目录

基本概念:

个人理解:

访问器的默认写法:

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;

文章来源:https://blog.csdn.net/weixin_73569934/article/details/134843979
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。