我正在创建一个新的类,突然想知道:
写法有何不同:
public string temp;
并且写作:
private string temp;
public string temp_
{
get { return temp; }
set { temp = value; }
}
我猜这可能是一个新手问题,但我没有找到一个绝对的答案... 在这两种情况下,似乎我都可以在类外访问对象。 私有形式只是一种懒散的方式吗?
是的,区别在于你有一个属性。C#中的属性是一对get和set方法的语法糖。实际上,编译器将代码块创建成两个单独的方法:get_PropertyName
和 set_PropertyName
,其中PropertyName
是您属性的名称。这些方法具有您实现在get
和set
块中的逻辑,使用您的属性的代码实际上会在后台调用这些方法。
这种方式的优点是您完全控制设置和检索值的方式。
例如 - 想象一下您想存储年龄:
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}
语法可以将其绑定到普通字段)。
public string Age;
private string Age;
public string Age_
{
get { return temp; }
set { if ( value >= 0 && value < 120 ) temp = value;
else // write some message
}
}
在 . 中编写一些代码,并进行一些测试,然后再设置或获取变量的值。
private string temp;
public string Temp
{
get { return temp; }
set { temp = value; }
}
属性遵循封装规则。属性是一个封装的变量字段。我们不能同时限制变量的获取和设置,但是通过属性可以实现。您还可以在属性内定义业务逻辑或编程结构。属性对于任何类型的模板或持久上下文(EF)都是透明的。