公有 vs 私有 {获取,设置}

8

我正在创建一个新的类,突然想知道:

写法有何不同:

public string temp;

并且写作:

private string temp;
public string temp_
{
get { return temp; }
set { temp = value; }
}

我猜这可能是一个新手问题,但我没有找到一个绝对的答案... 在这两种情况下,似乎我都可以在类外访问对象。 私有形式只是一种懒散的方式吗?

3个回答

21

是的,区别在于你有一个属性。C#中的属性是一对getset方法的语法糖。实际上,编译器将代码块创建成两个单独的方法:get_PropertyNameset_PropertyName,其中PropertyName是您属性的名称。这些方法具有您实现在getset块中的逻辑,使用您的属性的代码实际上会在后台调用这些方法。

这种方式的优点是您完全控制设置和检索值的方式。

例如 - 想象一下您想存储年龄:

public int Age;

现在,任何使用您的类的人都可以轻松地将年龄设置为他们想要的任何值-1000、-1或任何其他值。

现在,如果您有一个属性,您可以确保这种情况不会发生:

private int _age = 0;

public int Age
{
   get { return _age; }
   set { if ( value >= 0 && value < 120 ) _age = value; }
}

大部分情况下,即使您不需要任何验证逻辑,将公共字段声明为公共属性也是有益的,因为您可能在未来需要添加验证逻辑。如果您首先主动创建一个属性,那么使用您的库的其他代码不需要重新编译即可正常工作。

属性还可以更细粒度地控制getter和setter的可见性。您可以拥有一个带有public getter和private setter的public属性,以确保只有类本身才能更改属性的状态。

public Connected { get; private set; }

此外,有些地方你确实需要一个属性。其中之一是在WPF、UWP和其他MVVM模式中使用INotifyPropertyChanged接口。数据绑定需要将属性绑定到(尽管如果不需要通知,则这并不完全正确,因为UWP中的新{x:Bind}语法可以将其绑定到普通字段)。


1
太棒了,我正在实现它(使用vb.net)。 - Galacticai

2
如果您使用此选项。
public string Age;

你可以将变量设置为任何值,如 Age = "99999999"。
如果你使用这个
private string Age;
    public string Age_
    {
    get { return temp; }
    set { if ( value >= 0 && value < 120 ) temp = value;
         else  // write some message
 }
    }

在 . 中编写一些代码,并进行一些测试,然后再设置或获取变量的值。


1
不要使用小写字母作为属性名称的第一个字符。属性名称应该像这样:
private string temp;
public string Temp
{
   get { return temp; }
   set { temp = value; }
} 

属性遵循封装规则。属性是一个封装的变量字段。我们不能同时限制变量的获取和设置,但是通过属性可以实现。您还可以在属性内定义业务逻辑或编程结构。属性对于任何类型的模板或持久上下文(EF)都是透明的。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接