繁体   English   中英

公共与私人{get,set}

[英]Public vs Private{get, set}

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

public string temp;

并写作:

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

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

是的,不同之处在于您拥有房产 C#中的属性是具有一对getset方法的语法糖。 实际上,编译器接受代码块并创建两个单独的方法: get_PropertyNameset_PropertyName ,其中PropertyNamePropertyName的名称。 这些方法分别具有在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; }

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

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

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

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

如果你使用这个

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM