【问题标题】:Difference between Properties with get; set; and without get; set; [duplicate]属性与 get 的区别;放;并且没有得到;放; [复制]
【发布时间】:2013-04-05 06:09:26
【问题描述】:

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

public static int intId;

并获取;设置;属性:

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

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

【问题讨论】:

  • 第一个没有属性,它是一个字段。
  • 如果我告诉过你:每次设置 intId 时,打印一页,你可以使用属性来做到这一点。不带字段。将属性视为中间的函数。
  • 讽刺的是,你的 Property 是 StackOverflow。

标签: c# properties static get set


【解决方案1】:

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

最好始终将字段设为私有,并将它们包装在属性中。

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

【讨论】:

    【解决方案2】:

    第一个不是属性。它是一个领域。它也是一个静态的

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

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

    【讨论】:

      【解决方案3】:

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

      public static int intId;
      

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

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

      【讨论】:

        【解决方案4】:

        首先是静态字段;它甚至不是一个属性。

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

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

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

        【讨论】:

          【解决方案5】:

          这两者有什么区别?

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

          一个字段是一个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;
              }
          }
          

          【讨论】:

            猜你喜欢
            • 2011-07-09
            • 2020-12-30
            • 2020-01-19
            • 2013-04-21
            • 2018-04-28
            • 2013-06-13
            • 1970-01-01
            • 1970-01-01
            • 2011-06-28
            相关资源
            最近更新 更多