windows C#-实现具有自动实现属性的轻型类

ops/2024/12/15 8:32:43/

下面演示如何创建一个不可变的轻型类,该类仅用于封装一组自动实现的属性。 当你必须使用引用类型语义时,请使用此种构造而不是结构。

可通过以下方法来实现不可变的属性:

  • 仅声明 get 访问器,使属性除了能在该类型的构造函数中可变,在其他任何位置都不可变。
  • 声明 init 访问器而不是 set 访问器,这使属性只能在构造函数中进行设置,或者通过使用对象初始值设定项设置。
  • 将 set 访问器声明为专用。 属性可在该类型中设置,但它对于使用者是不可变的。

可以将 required 修饰符添加到属性声明中,以强制调用方将属性设置为初始化新对象的一部分。

下面的示例显示了只有 get 访问器的属性与具有 get 和 private set 的属性的区别。

class Contact
{public string Name { get; }public string Address { get; private set; }public Contact(string contactName, string contactAddress){// Both properties are accessible in the constructor.Name = contactName;Address = contactAddress;}// Name isn't assignable here. This will generate a compile error.//public void ChangeName(string newName) => Name = newName;// Address is assignable here.public void ChangeAddress(string newAddress) => Address = newAddress;
}
示例

以下示例演示了实现具有自动实现属性的不可变类的两种方法。 这两种方法均使用 private set 声明其中一个属性,使用单独的 get 声明另一个属性。 第一个类仅使用构造函数来初始化属性,第二个类则使用可调用构造函数的静态工厂方法。

// This class is immutable. After an object is created,
// it cannot be modified from outside the class. It uses a
// constructor to initialize its properties.
class Contact
{// Read-only property.public string Name { get; }// Read-write property with a private set accessor.public string Address { get; private set; }// Public constructor.public Contact(string contactName, string contactAddress){Name = contactName;Address = contactAddress;}
}// This class is immutable. After an object is created,
// it cannot be modified from outside the class. It uses a
// static method and private constructor to initialize its properties.
public class Contact2
{// Read-write property with a private set accessor.public string Name { get; private set; }// Read-only property.public string Address { get; }// Private constructor.private Contact2(string contactName, string contactAddress){Name = contactName;Address = contactAddress;}// Public factory method.public static Contact2 CreateContact(string name, string address){return new Contact2(name, address);}
}public class Program
{static void Main(){// Some simple data sources.string[] names = ["Terry Adams","Fadi Fakhouri", "Hanying Feng","Cesar Garcia", "Debra Garcia"];string[] addresses = ["123 Main St.", "345 Cypress Ave.", "678 1st Ave","12 108th St.", "89 E. 42nd St."];// Simple query to demonstrate object creation in select clause.// Create Contact objects by using a constructor.var query1 = from i in Enumerable.Range(0, 5)select new Contact(names[i], addresses[i]);// List elements cannot be modified by client code.var list = query1.ToList();foreach (var contact in list){Console.WriteLine("{0}, {1}", contact.Name, contact.Address);}// Create Contact2 objects by using a static factory method.var query2 = from i in Enumerable.Range(0, 5)select Contact2.CreateContact(names[i], addresses[i]);// Console output is identical to query1.var list2 = query2.ToList();// List elements cannot be modified by client code.// CS0272:// list2[0].Name = "Eugene Zabokritski";}
}/* Output:Terry Adams, 123 Main St.Fadi Fakhouri, 345 Cypress Ave.Hanying Feng, 678 1st AveCesar Garcia, 12 108th St.Debra Garcia, 89 E. 42nd St.
*/

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

相关文章

ubuntu20.04复现 Leg-KILO

这里写目录标题 opencv版本问题下载3.2.0源代码进入解压后的目录创建构建目录运行 CMake 配置 配置时指定一个独立的安装目录,例如 /opt/opencv-3.2:出错: 使用多线程编译错误1: stdlib.h: 没有那个文件或目录错误2:er…

学习maven(添加依赖坐标,maven的常用命令,依赖传递,解决依赖冲突)

目录 前言 添加依赖坐标 maven 的常用命令 如下图所示:重点是标红的 如何使用这些maven的常用命令呢? 实例 maven常用的命令可以在IDEA中有自带插件来完成 打开IDEA的命令行终端 依赖传递 什么是依赖传递呢? 解决依赖冲突问题 什么…

网络爬虫全解析

一、网络爬虫基础要点 (一)爬虫原理 目标确定:明确需要抓取数据的网站或网页范围,例如针对特定电商平台抓取商品信息,或聚焦新闻网站获取新闻报道内容,要考量数据的价值与用途。URL 解析:理解网…

CodeFuse「编码挑战季」:冲刺最后1个月!MelGeek磁轴键盘、Beats耳机等你来拿~

本次活动自 1024 程序员节开始,12 月底结束,还有一个月的挑战时间,速来参与,赢取超值奖品!!! 活动介绍 本次 CodeFuse「编码挑战季」活动,需实际完成muAgent、MFTCoder、ModelCache…

SSM虾米音乐项目6--后台专辑模块的修改和删除

删除操作 删除的前端界面 删除的前端代码 <button data-toggle"button" class"btn btn-sm btn-warning" aid"${album.aid}" pic"${album.pic}"> 删除 </button></td> 点击删除按钮&#xff0c;会调用JS中的AJAX请…

【k8s】kubectl get nodes报NotReady

目录 1. 说明2. 问题描述3. kube-flannel.yml 1. 说明 1.这里k8s的版本是v1.17.4。2.若kube-flannel.yml中的镜像拉取不下来&#xff0c;可以下载本文章的文件资源&#xff0c;手动docker load -i ***.tar的方式。3.v1.17.4的kube-flannel.yml参考下面代码。4.通过kubectl get…

SpringBoot连接数据库启动报错Plugin ‘mysql_native_password‘ is not loaded(2024最新)

文章目录 1.报错内容&#xff1a;2.解决方案2.1 进入到mysqlserver的安装目录&#xff0c;如下图&#xff0c;并找到my.ini文件2.2修改my.ini文件内容 2.2 重启mysql服务 1.报错内容&#xff1a; 使用mysql8.0—springboot项目运行报错 Plugin ‘mysql_native_password’ is n…

Pandas常见函数

Pandas 是 Python 中用于数据分析和处理的强大工具库。以下是 Pandas 中一些常见的函数和方法&#xff0c;按用途分类总结&#xff1a; 1. 数据创建 pd.Series(data, index)&#xff1a;创建一维的序列对象。pd.DataFrame(data, index, columns)&#xff1a;创建二维的DataFra…