C# 中可以有同名的公共 getter 和私有 setter 吗

c++

1个回答

写回答

d_las

2025-07-10 00:10

+ 关注

ABS
ABS

在C#中,可以有同名的公共getter和私有setter。这允许我们在外部访问属性的值,但只能在内部设置属性的值。这种设计模式可以帮助我们控制对属性的访问,并确保属性值的有效性和安全性。在本文中,我们将探讨这种模式的用途,并提供一些示例代码来说明其工作原理。

为什么需要同名的公共getter和私有setter?

在面向对象的编程中,属性通常用于封装类中的数据,并通过公共的getter和setter方法来访问和修改属性的值。然而,有时我们希望对属性的访问进行更细粒度的控制,以确保数据的完整性和安全性。这就是为什么C#中允许我们定义同名的公共getter和私有setter的原因。

如何定义同名的公共getter和私有setter?

要定义同名的公共getter和私有setter,我们可以使用C#的属性(property)语法。属性可以看作是特殊的方法,它们允许我们在读取和写入属性值时执行自定义的逻辑。下面是一个示例代码:

public class Person

{

private string _name;

public string Name

{

get { return _name; }

private set { _name = value; }

}

public Person(string name)

{

Name = name;

}

}

在上面的代码中,我们定义了一个名为"Name"的属性,它有一个公共的getter和一个私有的setter。getter方法返回私有字段"_name"的值,而setter方法只能在类的内部使用,用于设置私有字段的值。

使用同名的公共getter和私有setter的好处

使用同名的公共getter和私有setter可以带来一些好处。首先,它允许我们在外部读取属性的值,但只允许在类的内部设置属性的值。这提供了更好的封装性,避免了属性值被意外修改的风险。

其次,这种模式允许我们在设置属性值时执行自定义的逻辑。例如,我们可以在setter方法中添加一些验证逻辑,以确保属性值的有效性。这样一来,我们可以更好地控制属性的数据完整性和安全性。

示例代码

为了更好地理解同名的公共getter和私有setter的用法,让我们看一个示例代码:

public class Temperature

{

private double _celsius;

public double Celsius

{

get { return _celsius; }

private set

{

if (value < -273.15)</p> {

throw new ArgumentOutOfRangeException("Temperature cannot be below ABSolute zero.");

}

_celsius = value;

}

}

public Temperature(double celsius)

{

Celsius = celsius;

}

}

在上面的代码中,我们定义了一个名为"Celsius"的属性,它有一个公共的getter和一个私有的setter。在setter方法中,我们添加了一些验证逻辑,确保温度不会低于绝对零度(-273.15摄氏度)。如果温度低于绝对零度,将抛出一个异常。

class Program

{

static void MAIn(string[] args)

{

try

{

Temperature temperature = new Temperature(-300);

Console.WriteLine("Temperature in Celsius: " + temperature.Celsius);

}

catch (Exception ex)

{

Console.WriteLine("An error occurred: " + ex.Message);

}

}

}

在上面的示例中,我们首先创建了一个温度对象,将温度设置为-300摄氏度。由于温度低于绝对零度,将抛出一个异常。我们在try-catch块中捕获异常,并输出错误消息。

在C#中,我们可以使用同名的公共getter和私有setter来控制对属性的访问。这种设计模式提供了更好的封装性和安全性,并允许我们执行自定义的逻辑来确保属性值的有效性。通过合理使用同名的公共getter和私有setter,我们可以编写更健壮和安全的代码。

举报有用(4)分享收藏

Copyright © 2025 IZhiDa.com All Rights Reserved.

知答 版权所有 粤ICP备2023042255号