在C#中,我注意到许多程序员执行以下操作:
class X
{
private int test_;
public int test
{
get { return test_; }
set { if (test_ != value) test_ = value; }
}
}
我的问题是为什么要保留相同内容的私有变量和公共变量?
为什么我们不这样做?
class X
{
public int test
{
get; set;
}
}
我的意思是,我们正在改变私有变量。不使用单个公共变量有什么意义呢?
答案 0 :(得分:3)
代码:
class X
{
public int test
{
get; set;
}
}
...直接等同于此:
class X
{
private int test_;
public int test
{
get { return test_; }
set { test_ = value; }
}
}
第一个示例是自动实现的属性。编译时,C#编译器会自动生成第二个例子。
现在,您首先提供的代码有这一行:
set { if (test_ != value) test_ = value; }
您会注意到它正在执行与自动属性等效代码不同的操作。而这就是这两种方法的区别所在。
当您为属性使用支持字段时,您可以引入需要代码遵循的特定规则。
例如,您可能希望在音乐应用上设置音量,因此您的代码可能如下所示:
public class Music
{
private int _volume = 7;
public int Volume
{
get { return _volume; }
set
{
if (value >= 0 && value <= 10)
{
_volume = value;
}
}
}
}
当您的属性包含这样的逻辑时,通常会有一个私有字段变量。
答案 1 :(得分:1)
这些不是两个变量。一个是场地,另一个是财产。属性是伪装的可选getter和setter方法。
您对该解决方案的提议实际上是该语言的一部分,称为自动实现的属性: https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/classes-and-structs/auto-implemented-properties