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引入的重要特性之一,它使得对象的初始化过程更加简洁和可读。通过只初始化设置器,我们可以轻松地创建只读属性、复制对象和进行属性赋值验证。这些功能可以帮助开发人员编写更简洁、更可靠的代码。
在日常的编码工作中,我们应该善于利用这项新特性,以提高代码的可读性和可维护性。同时,我们也应该注意只初始化设置器的适用场景,避免在不合适的情况下滥用此特性。