windows C#-自动实现的属性

ops/2024/12/13 12:47:51/

当属性访问器中不需要其他逻辑时,自动实现的属性使属性声明更加简洁。 它们还允许客户端代码创建对象。 当你声明以下示例中所示的属性时,编译器将创建仅可以通过该属性的 get 和 set 访问器访问的专用、匿名支持字段。 init 访问器也可以声明为自动实现的属性。

以下示例演示了一个具有一些自动实现属性的简单类:

// This class is mutable. Its data can be modified from
// outside the class.
public class Customer
{// Auto-implemented properties for trivial get and setpublic double TotalPurchases { get; set; }public string Name { get; set; }public int CustomerId { get; set; }// Constructorpublic Customer(double purchases, string name, int id){TotalPurchases = purchases;Name = name;CustomerId = id;}// Methodspublic string GetContactInfo() { return "ContactInfo"; }public string GetTransactionHistory() { return "History"; }// .. Additional methods, events, etc.
}class Program
{static void Main(){// Initialize a new object.Customer cust1 = new Customer(4987.63, "Northwind", 90108);// Modify a property.cust1.TotalPurchases += 499.99;}
}

无法在接口中声明自动实现的属性。 自动实现的属性和字段支持的属性声明专用实例支持字段,接口无法声明实例字段。 在接口中声明属性而不定义正文声明具有访问器的属性。 实现该接口的每个类型都必须实现该属性。

可以初始化自动实现的属性,类似于字段:

public string FirstName { get; set; } = "Jane";

上一示例中所示的类是可变的。 客户端代码在创建后可以更改对象中的值。 在包含重要行为(方法)以及数据的复杂类中,通常有必要具有公共属性。 但是,对于那些仅封装一组值(数据)且很少或没有行为的小型类或结构,应该使用以下选项之一使对象不可变:

只声明 get 访问器(除了能在构造函数中可变,在其他任何位置都不可变)。
声明 get 访问器和 init 访问器(除了能在对象构造函数中可变,在其他任何位置都不可变)。
将 set 访问器声明为专用(对使用者不可变)。

可能需要将验证添加到自动实现的属性。 C# 13 将字段支持的属性添加为预览功能。 使用 field 关键字访问自动实现属性的编译器合成后盾字段。 例如,可以确保 FirstName 前面的示例中的属性不能设置为 null 或空字符串:

public string FirstName 
{ get; set { field = (string.IsNullOrWhiteSpace(value) is false? value: throw new ArgumentException(nameof(value), "First name can't be whitespace or null"));}
} = "Jane";

此功能使你可以向访问器添加逻辑,而无需显式声明后盾字段。 使用 field 关键字访问编译器生成的后盾字段。

关键字 field 是 C# 13 中的预览功能。 必须使用 .NET 9 并将元素preview设置为<LangVersion>项目文件中,才能使用field上下文关键字。

应注意在 field 具有名为 field字段的类中使用关键字功能。 新 field 关键字将隐藏属性访问器范围中命名 field 的字段。 可以更改变量的名称 field ,或使用 @ 令牌将标识符引用 field 为 @field。 可以通过阅读关键字的功能规范field来了解详细信息。


http://www.ppmy.cn/ops/141541.html

相关文章

FristiLeaks 1.3靶场渗透测试

FristiLeaks 1.3: https://www.vulnhub.com/entry/fristileaks-13,133/ 靶场&#xff1a;FristiLeaks 1.3靶场 攻击机&#xff1a;kali-linux-2024 1&#xff0c;在开启之前我们需要将靶机网络适配器改为NAT模式&#xff0c;并且对MAC地址进行手动编辑&#xff0c;VMware用户需…

开发一套SDK 第一弹

自动安装依赖包 添加条件使能 #ex: filetypesh bash_ls 识别 达到预期,多个硬件环境 等待文件文件系统挂在完成 或者创建 /sys/class/ 属性文件灌入配置操作 AI 提供的 netlink 调试方法,也是目前主流调用方法,socket yyds #include <linux/module.h> #include <linux…

HTML前端开发-- Iconfont 矢量图库使用简介

一、SVG 简介及基础语法 1. SVG 简介 SVG&#xff08;Scalable Vector Graphics&#xff09;是一种基于 XML 的矢量图形格式&#xff0c;用于在网页上显示二维图形。SVG 图形可以无限缩放而不会失真&#xff0c;非常适合用于图标、图表和复杂图形。SVG 文件是文本文件&#x…

Python数据分析(OpenCV视频处理)

处理视频我们引入的还是numpy 和 OpenCV 的包 引入方式如下&#xff1a; import numpy as np import cv2 我们使用OpenCV来加载本地视频&#xff0c;参数就是你视频的路径就可以 #加载视频 cap cv2.VideoCapture(./1.mp4) 下面我们进行读取视频 #读取视频 flag,frame cap.re…

基于springboot的机器人学习交流网站系统

博主介绍&#xff1a;java高级开发&#xff0c;从事互联网行业六年&#xff0c;熟悉各种主流语言&#xff0c;精通java、python、php、爬虫、web开发&#xff0c;已经做了多年的设计程序开发&#xff0c;开发过上千套设计程序&#xff0c;没有什么华丽的语言&#xff0c;只有实…

深度优先的艺术:探索二叉树的深搜算法精髓

文章目录 前言☀️一、计算布尔二叉树的值&#x1f319;解法⭐代码 ☀️二、求根节点到叶节点数字之和&#x1f319;解法⭐代码 ☀️三、二叉树剪枝&#x1f319;解法⭐代码 ☀️四、验证二叉搜索树&#x1f319;解法☁️步骤⭐代码 ☀️五、二叉搜索树中第k小的元素&#x1f3…

7. MySQL 管理:系统数据库与常见工具

本文详述 MySQL 的系统数据库功能及常见工具的简单用法&#xff0c;并提供具体指令解析。 1. 系统数据库 MySQL 默认提供四个系统数据库&#xff0c;每个数据库都有特定的功能。下表总结了它们的作用&#xff1a; 数据库名作用mysql存储数据库用户、权限、角色等管理信息。如…

MySQL知识大总结(进阶)

一&#xff0c;数据库的约束 1&#xff0c;约束类型 1not null非空约束&#xff0c;标记这个字段不可以为空2unique唯一约束&#xff0c;标记这个字段的值是该列唯一的值&#xff0c;在这一列的其他行&#xff0c;不可以与该字段相等3default 默认约束&#xff0c;在该字段没…