C# 9.0新特性——只初始化设置器

1. 简介

C# 9.0 是微软最新发布的C#编程语言版本,带来了一些令人兴奋的新特性。其中,只初始化设置器是一项非常重要的新特性,它使得在对象初始化时可以只给设置器赋值,而不需要为字段赋初值。这项功能的引入大大简化了开发人员在初始化对象时的编码工作,同时也增强了代码的可读性和可维护性。

2. 普通属性的问题

在C# 9.0之前,我们声明一个包含属性的类时,通常需要为属性的字段添加初始值:

public class TemperatureSensor

{

private double _temperature = 0.0;

public double Temperature

{

get { return _temperature; }

set { _temperature = value; }

}

}

在上面的例子中,我们需要为_temperature字段赋予初始值0.0。这会导致我们的代码变得冗长,并且在只设置属性值时会显得多余。此外,如果我们忘记为字段赋值,会导致潜在的逻辑错误。

3. C# 9.0的解决方案

C# 9.0引入了只初始化设置器的概念,可以通过使用init关键字来声明属性。这样一来,我们就可以简化初始化的过程并提高代码的可读性:

public class TemperatureSensor

{

public double Temperature { get; init; }

}

如上所示,我们只需要在getter之后加上关键字init,就可以将setter标记为只初始化设置器。这样我们在创建对象时,只需要使用对象初始化器来给属性赋值即可:

TemperatureSensor sensor = new TemperatureSensor

{

Temperature = 0.6

};

在上面的例子中,我们可以看到在初始化TemperatureSensor对象时,我们只需要设置Temperature属性的值而不需要给字段赋初始值。这样一来,我们的代码变得更加简洁清晰。

4. 只初始化设置器的特性

只初始化设置器带来了一些非常有用的特性,让我们更加灵活地初始化对象:

4.1 只读属性

只初始化设置器让我们可以轻松地创建只读属性。只读属性是指只能在对象初始化时设置一次值,并且无法在后续代码中对其进行修改:

public class TemperatureSensor

{

public double Temperature { get; init; }

}

在上面的例子中,Temperature属性被标记为只初始化设置器,因此它只能在对象初始化时被赋值,而无法在后续代码中修改。

4.2 复制对象

只初始化设置器还使得创建不可变的对象变得更加容易。通过将属性标记为只初始化设置器,我们可以确保属性的值在对象生命周期内不会被修改:

public class TemperatureSensor

{

public double Temperature { get; init; }

}

TemperatureSensor sensor1 = new TemperatureSensor { Temperature = 0.6 };

TemperatureSensor sensor2 = sensor1; // 复制sensor1

在上面的例子中,我们创建了一个TemperatureSensor对象sensor1,并将其赋值给sensor2。由于Temperature属性是只初始化设置器,所以在复制操作中,sensor2将保留sensor1的初始值。

4.3 属性赋值验证

只初始化设置器也对属性值进行验证提供了便利。通过在设置器中添加验证逻辑,我们可以确保只有合法的值被赋给属性:

public class TemperatureSensor

{

private double _temperature;

public double Temperature

{

get { return _temperature; }

init

{

if (value < -1000 || value > 1000)

{

throw new ArgumentOutOfRangeException("Invalid temperature");

}

_temperature = value;

}

}

}

在上面的例子中,我们将Temperature属性改为只初始化设置器,并在设置器中添加了温度范围的验证逻辑。如果赋给属性的值不在有效范围内,将抛出ArgumentOutOfRangeException异常。

5. 结论

只初始化设置器是C# 9.0引入的重要特性之一,它使得对象的初始化过程更加简洁和可读。通过只初始化设置器,我们可以轻松地创建只读属性、复制对象和进行属性赋值验证。这些功能可以帮助开发人员编写更简洁、更可靠的代码。

在日常的编码工作中,我们应该善于利用这项新特性,以提高代码的可读性和可维护性。同时,我们也应该注意只初始化设置器的适用场景,避免在不合适的情况下滥用此特性。

后端开发标签