有时候,我看到类包含这样声明的属性:
public int MyProperty { get; set; }
其他属性的声明如下:
private int myVar;
public int MyProperty
{
get { return myVar; }
set { myVar = value; }
}
我来自Java背景,所以我不太了解第二(完整)声明。
在第二种情况下,为什么我们应该有私有部分和公开部分? 在这种情况下,我们使用第一个声明而不是第二个(或相反的)声明。 谁能解释其他差异?
答案 0 :(得分:2)
第一种情况实际上是第二种情况的简写形式,在这种情况下,您仅使用get
和set
访问器分别检索和分配值。
不添加任何其他逻辑
它们被称为自动实施的属性。
关于您有关为什么将第一个int定义为私有的问题?
好吧,这就是 properties !
它们提供了一种读取和写入private field
的值的机制。
答案 1 :(得分:1)
在您的示例中,它们是完全相同的。第一个只是第二个的简写。
那我们为什么还要使用第二个呢?
如果我们想验证我们的价值怎么办?我们可以做这样的事情:
private int myVar;
public int MyProperty
{
get { return myVar; }
set
{
if(value < 0)
throw new Exception("Property can't be less than 0!").
myVar = value;
}
}
其他示例可能是如果在设置MyProperty
时需要重新计算某些内容。或者,也许您需要引发一个事件来让其他班级知道它已被更改等。
答案 2 :(得分:0)
在c#中,封装是将数据成员和成员函数绑定到单个单元中的过程。在c#中,类是封装的实时示例,因为它将各种类型的数据成员和成员函数组合到一个单元中。
例如,您提供一个库,而不希望第二人拥有有关您的程序或某些其他功能或其他类访问类的大量信息。 这样,您可以像在项目中使用的其他库一样定义库,但是我们无权访问其内部。 在这种情况下,您可以封装您的类。
也就是说,您不能访问程序中其他地方的类函数或功能,例如:
public int MyProperty {get;组; }在您的项目中是全球性的
private int myVar;
public int MyProperty
{
get { return myVar; }
set { myVar = value; }
}
您有权访问MyProperty,而不是myVar