属性与get的区别;组;没有得到;组;

时间:2013-04-12 16:05:27

标签: c# properties static get set

我不明白静态属性之间的区别:

public static int intId;

并得到;设定;属性:

public int intId
{
  get
  {
    return intId;
  }
  set
  {
    intId = value;
  }
}

这两者有什么区别?他们的工作方式相同或不同?

5 个答案:

答案 0 :(得分:5)

您的第一个样本是字段,而不是属性。

总是将字段设为私有,并将其包装在属性中是一种很好的做法。

通过这种方式,您可以在后代中添加set或override属性的验证(如果它被标记为虚拟)。此外,您可以在get和set中添加一些棘手的代码,这些代码将隐藏在使用您的类的人身上。

答案 1 :(得分:1)

第一个不是财产。这是一个领域。它也是 static

即使它不是静态的,也是一个实例变量,两者是不同的,并编译为不同的IL。

关于为什么在公共字段上使用简单属性 - 属性允许您封装后面的实现。它们允许您在不更改界面的情况下更改类型内部。

答案 2 :(得分:0)

第一个是静态场;它甚至不是财产。

静态字段只有一个应用程序值。

虽然第二个是实例属性,但对于每个类的实例都是不同的。

如果它是属性或字段,则在此示例中没有太大区别。但从长远来看,如果你在界面中使用了一个属性,你可能会在以后更改它以获得一个实际的getter和setter,例如,验证或使对象以某种方式对新值做出反应。字段只是一个字段,您无法控制它何时以及如何设置并对其作出反应。

答案 3 :(得分:0)

  

这两者有什么区别?

您的第一个代码示例是字段,第二个代码是属性。

字段是class成员,在调用class之前,class实例化(如果它在constructor定义上设置),其值被分配你在设置或获取它时没有任何控制权:

public static int intId;

一个属性是class成员,我可以把它描述为一个特殊的“字段”,你可以控制它如何设置和获取数据,换句话说 - 封装,它是一种功能,但表现得像一个字段:

public int intId
    {
        get
        {
            return intId;
        }
        set
        {
            intId = value;
        }
    }

在您的示例中,int属性正在使用static int字段,但您正在错误地使用这两个字段:

  1. 您的字段应使用private修饰符,而不是static,否则无法使用它,因为它可能会从外部来源更改。

  2. 它们都有相同的名称,请进行更改。

  3. 就像那样:

    private int _intId;
    
    public int IntId
    {
        get
        {
            return _intId;
        }
        set
        {
            _intId = value;
        }
    }
    

答案 4 :(得分:0)

它们是该类的相同int变量,但是第一个因为它是一个静态int,它可以从Class访问并且可以被更改,并且它的任何实例都具有相同的值。

public static int intId;

第二个实例将只访问实例,并且每个实例都有一个唯一值,因为它不是静态的,但是任何人都可以访问它,因为它是公开的。

 public int intId
    {
        get
        {
            return intId;
        }
        set
        {
            intId = value;
        }
    }