属性与get的区别;设置;没有得到;设置;
本文关键字:设置 属性 get 区别 | 更新日期: 2023-09-27 18:09:06
我不明白静态属性之间的区别:
public static int intId;
和获取;设置;属性:
public int intId
{
get
{
return intId;
}
set
{
intId = value;
}
}
这两者的区别是什么?它们的工作原理相同还是不同?
第一个示例是一个字段,而不是属性。
总是将字段设为私有,并将它们包装在属性中是一个很好的做法。
这样你就可以在后代中添加对set或override属性的验证(如果它被标记为virtual)。您还可以在get和set中添加一些复杂的代码,这些代码将对使用您的类的人隐藏。
第一个不是属性。它是一块田地。它也是一个静态。
即使它不是静态的,而是一个实例变量,这两者也是不同的,并且编译成不同的IL。
关于为什么在公共字段上使用简单属性-属性允许您封装后面的实现。它们允许您在不更改接口的情况下更改类型内部。
对于类来说它们是相同的整型变量,但是第一个因为是静态整型,所以可以从类中访问它,并且可以更改它的任何实例都具有相同的值。
public static int intId;
第二个变量只能被实例访问,并且每个实例的值都是唯一的,因为它不是静态的,但它可以被任何人访问,因为它是公共的。
public int intId
{
get
{
return intId;
}
set
{
intId = value;
}
}
第一个是静态字段;它甚至不是一个属性
静态字段对于应用程序来说只有一个值。
第二个属性是实例属性,对于类的每个实例都是不同的。
在本例中,如果它是一个属性或字段,则没有太大区别。但从长远来看,如果你在接口中使用属性,你可能会在以后更改它,让它有一个实际的getter和setter来做例如,验证或让对象对新值做出某种反应。字段只是一个字段,您无法控制何时以及如何设置它并对其作出反应。
这两者的区别是什么?
第一个代码示例是一个字段,第二个代码示例是一个属性。
字段是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;
}
}