我不明白静态属性之间的区别:
public static int intId;
并得到;设置;特性:
public int intId
{
get
{
return intId;
}
set
{
intId = value;
}
}
这两者有什么区别?它们的工作方式相同还是不同?
我不明白静态属性之间的区别:
public static int intId;
并得到;设置;特性:
public int intId
{
get
{
return intId;
}
set
{
intId = value;
}
}
这两者有什么区别?它们的工作方式相同还是不同?
您的第一个示例是一个字段,而不是一个属性。
始终将字段设为私有并将它们包装在属性中是一种很好的做法。
这样,您可以在后代中添加对 set 或覆盖属性的验证(如果它被标记为虚拟)。您还可以在 get 和 set 中添加一些棘手的代码,这些代码将对使用您的课程的人隐藏。
第一个不是财产。它是一个领域。它也是一个静态的。
即使它不是静态的,而是一个实例变量,两者也是不同的,编译成不同的 IL。
关于为什么在公共字段上使用简单属性 - 属性允许您封装背后的实现。它们允许您在不更改接口的情况下更改类型内部。
这两者有什么区别?
您的第一个代码示例是一个字段,而您的第二个代码示例是一个属性。
字段是一个class
成员,它的值是在class
实例化时分配的(如果它是在class
定义上设置的),在constructor
被调用之前,你在设置或获取它时没有任何控制:
public static int intId;
属性是一个class
成员,我可以将其描述为一个特殊的“字段”,您可以控制数据的设置和获取方式,换句话说 - 封装,它是一种函数,但行为类似于字段:
public int intId
{
get
{
return intId;
}
set
{
intId = value;
}
}
在您的示例中,该int
属性正在使用该static
int
字段,但您对两者的使用都错误:
您的字段应该带有private
修饰符而不是static
,否则使用它没有意义,因为它可能会从外部来源更改。
两个名字一样,改一下。
像那样:
private int _intId;
public int IntId
{
get
{
return _intId;
}
set
{
_intId = value;
}
}
它们是该类的相同 int 变量,但是第一个是静态 int,它将从 Class 访问并且可以更改,并且它的任何实例都将具有相同的值。
public static int intId;
第二个将仅由实例访问,并且每个实例具有唯一值,因为它不是静态的,但自从它公开以来,任何人都可以访问它。
public int intId
{
get
{
return intId;
}
set
{
intId = value;
}
}
首先是静态场;它甚至不是财产。
静态字段对于应用程序只有一个值。
而第二个是实例属性,对于类的每个实例都是不同的。
如果它是属性或字段,则在此示例中没有太大区别。但从长远来看,如果您在界面中使用属性,您可能会在以后更改它以拥有一个实际的 getter 和 setter,例如验证或使对象以某种方式对新值做出反应。字段只是一个字段,您无法控制何时以及如何设置它并对它做出反应。