1

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

public static int intId;

并得到;设置;特性:

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

这两者有什么区别?它们的工作方式相同还是不同?

4

5 回答 5

5

您的第一个示例是一个字段,而不是一个属性。

始终将字段设为私有并将它们包装在属性中是一种很好的做法。

这样,您可以在后代中添加对 set 或覆盖属性的验证(如果它被标记为虚拟)。您还可以在 get 和 set 中添加一些棘手的代码,这些代码将对使用您的课程的人隐藏。

于 2013-04-12T16:06:14.807 回答
1

第一个不是财产。它是一个领域。它也是一个静态的。

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

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

于 2013-04-12T16:06:50.887 回答
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. 两个名字一样,改一下。

像那样:

private int _intId;

public int IntId
{
    get
    {
        return _intId;
    }
    set
    {
        _intId = value;
    }
}
于 2013-04-12T16:08:12.060 回答
0

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

public static int intId;

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

 public int intId
    {
        get
        {
            return intId;
        }
        set
        {
            intId = value;
        }
    }
于 2013-04-12T16:20:36.000 回答
0

首先是静态场;它甚至不是财产。

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

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

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

于 2013-04-12T16:06:52.520 回答