C#9新特性init only setter的使用

下面是"C#9新特性initonlysetter的使用"的完整攻略。

简介

在C# 9中,推出了一个新的修饰符 init。与 set 不同, init 可以在构造函数中初始化值,并保证在构造函数执行完后,其值不能再次修改。这种属性的更新只能在创建对象和构造函数之间进行。这个新特性非常有意义,因为它可以让我们以更安全和可维护的方式创建不可变的对象。

使用

使用 init-only setter 可以在属性声明中使用 init。定义使用 init-only setter 的属性后,可以在构造函数中进行初始化。

public class Person
{
    public string FirstName { get; init; }
    public string LastName { get; init; }

    public Person(string firstName, string lastName)
    {
        this.FirstName = firstName;
        this.LastName = lastName;
    }
}

在上述代码中,FirstNameLastName 的属性使用 init-only setter 设置,在构造函数 Person(string firstName, string lastName) 中可以设置这些属性的值。

当我们使用 init 时,属性的值就不能够在进行修改了。例如:

Person person = new Person("John", "Doe");
// 正确
Debug.Log(person.FirstName);  // "John"
// 以下代码会导致编译时期抛出异常
person.FirstName = "Tom";

上面的代码通过取消对 FirstName 属性的 set 访问器来创建了一个只读属性。在触发构造函数完成之后,我们不能再次修改这个值。

示例

现在我们考虑另一个示例,使用 init-only setter 开发一个 Point 类。除外,这个类还对连续的点进行了统计,最后一个点的值是不可修改的。

public class Point
{
    public int X { get; init; }
    public int Y { get; init; }

    public Point(int x, int y)
    {
        this.X = x;
        this.Y = y;

        Count++;
        LastPoint = this;
    }

    public static int Count { get; init; }
    public static Point LastPoint { get; init; }
}

在上述代码中,我们使用 init-only setter 来创建了 Count 和 LastPoint 静态属性。

现在,我们可以创建 Point 对象,并统计它们的数量和最后一个点。

Point p1 = new Point(10, 20);  
Point p2 = new Point(30, 40);

// Count 和 LastPoint 都是只读的
Debug.Log(Point.Count);  // 2
Debug.Log(Point.LastPoint.X);  // 30

// 错误,不能修改最后一个点
Point.LastPoint.X = 50;

在这个示例中,我们使用了 init-only setter 和静态属性,在 Point 中建立了一个简单的点对象。我们还演示了 Count 和 LastPoint 属性的使用方法。由于 Count 和 LastPoint 是只读的,所以我们不能修改它们的值。

这就是“C#9新特性init-only setter的使用”的完整攻略。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C#9新特性init only setter的使用 - Python技术站

(0)
上一篇 2023年5月15日
下一篇 2023年5月15日

相关文章

  • springMVC+velocity实现仿Datatables局部刷新分页方法

    我们将使用SpringMVC和Velocity作为模板引擎来实现仿Datatables局部刷新分页的功能。以下是详细的步骤: 第一步:配置SpringMVC 为了使用SpringMVC,我们需要添加如下依赖: <dependency> <groupId>org.springframework</groupId> <a…

    C# 2023年5月31日
    00
  • 聊一聊 dotnet-trace 调查 lock锁竞争

    一:背景 1. 讲故事 最近在分析一个 linux 上的 dump,最后的诱因是大量的lock锁诱发的高频上下文切换,虽然问题告一段落,但我还想知道一点信息,所谓的高频到底有多高频?锁竞争到底是一个怎样的锁竞争? 如果了解这些信息对我们后续分析此类问题非常有帮助。 要想获取此类信息,看 dump 肯定是没有用的,只能给程序安装一个摄像头,在 Windows …

    C# 2023年5月9日
    00
  • 运行Windows终端(PowerShell)提示由于找不到mscoree.dll无法继续执行代码

    当在Windows终端(PowerShell)中运行代码时,可能会遇到“找不到mscoree.dll”错误。这个错误通常是由于.NET Framework未正确安装或未正确注册所致。以下是解决此问题的完整攻略。 1. 确认.NET Framework已正确安装 首先,我们需要确认.NET Framework已正确安装。可以通过以下步骤检查: 打开“控制面板”…

    C# 2023年5月15日
    00
  • .NetCore基础之读取配置文件详解

    .NET Core基础之读取配置文件详解 在.NET Core应用程序中,我们可以使用配置文件来存储应用程序的配置信息。本攻略将详细介绍如何读取配置文件,并提供两个示例说明。 配置文件格式 在.NET Core应用程序中,我们可以使用多种格式的配置文件,包括JSON、XML、INI等。以下是一个简单的JSON格式的配置文件示例: { "Loggin…

    C# 2023年5月17日
    00
  • C#调用C++dll方法步骤

    C#与C++是两种不同的编程语言,但C#调用C++ DLL是一个非常常见的需求。下面就是调用C++ DLL的步骤: 步骤一:编写C++ DLL 首先,需要编写C++的DLL。以下是一个简单的例子: // ExampleDLL.cpp #ifdef EXAMPLEDLL_EXPORTS #define EXAMPLEDLL_API __declspec(dll…

    C# 2023年5月15日
    00
  • asp.net GridView排序简单实现

    下面我将为你详细讲解“asp.net GridView排序简单实现”的完整攻略。 一、前置知识 在讲解排序实现前,我们需要先了解GridView控件的使用方法: 1. GridView的基本用法 GridView是asp.net中的一个非常常用的控件,一般用于展示数据表格。使用GridView控件展示数据非常方便。GridView控件有如下几个主要的属性: …

    C# 2023年5月31日
    00
  • .Net 自定义转换器JsonConverter的使用详解

    .Net 自定义转换器JsonConverter的使用详解 什么是JsonConverter JsonConverter 是Json.NET 库中的一个抽象类,它是一个非常强大和灵活的工具,用于将一个类型的实例转换为 JSON 自定义结构。你可以使用 JsonConverter 来处理各种情况,例如类型转换、数据格式转换、时间日期转换等等,以满足你的特殊需求…

    C# 2023年5月31日
    00
  • ASP.NET Core MVC中的视图(Views)

    接下来我将详细讲解ASP.NET Core MVC中的视图(Views)。 视图是什么? 视图是MVC中的一部分,它是网页用户界面的一部分,也就是网页的HTML代码。在MVC框架中,控制器(Controller)返回模型数据给视图(View),视图负责展示这些数据。视图文件通常采用Razor语法,可以添加HTML代码和模型数据内容,最终被浏览器渲染成网页。 …

    C# 2023年6月3日
    00
合作推广
合作推广
分享本页
返回顶部