公开与私人{get,set}

时间:2017-01-15 08:16:35

标签: c# .net

我正在上新课,我发现自己在想: 写作之间有什么区别:

public string temp;

写作:

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

我猜这是一个新手问题,但我找不到绝对答案...... 在这两种情况下,似乎我都可以访问类外的对象。 私人表格只是一种草率的方式吗?

3 个答案:

答案 0 :(得分:9)

是的,不同之处在于您拥有属性。 C#中的属性比具有一对 get set 方法的语法糖。实际上,编译器接受代码块并创建两个单独的方法: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属性public getter和private setter,以确保只有类本身可以更改属性的状态。

public Connected { get; private set; }

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

答案 1 :(得分:1)

永远不要用小写声明属性的第一个字符。属性名称应为:

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

属性遵循封装规则。属性是变量的封装字段。我们不能一次限制值和为变量设置,而是通过属性来限制。您还可以在属性内定义业务逻辑或编程构造。属性是透明的,具有任何类型的模板化或持久化上下文(EF)。

答案 2 :(得分:1)

如果你使用这个

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
 }
    }

你可以在里面写一些代码。在进行设置或获取变量值之前进行一些测试