关于c#:与get之间的区别;

Difference between Properties with get; set; and without get; set;

本问题已经有最佳答案,请猛点这里访问。

我不理解静态特性之间的区别:

1
public static int intId;

和获取;设置;属性:

1
2
3
4
5
6
7
8
9
10
11
public int intId
{
  get
  {
    return intId;
  }
  set
  {
    intId = value;
  }
}

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


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

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

这样,您就可以在子体中的set或override属性上添加验证(如果该属性标记为virtual)。此外,您还可以在get和set中添加一些复杂的代码,这些代码将对使用类的人隐藏。


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

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

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


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

1
public static int intId;

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

4


0

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

字段是一个class成员,它的值在class实例化(如果它设置在class定义上),在调用constructor之前被赋值,并且在设置或获取它时您没有任何控制权:

1
public static int intId;

属性是class成员,我可以将其描述为一个特殊的"字段",您可以控制如何设置和获取数据,换句话说,封装,它是一种函数,但其行为类似于字段:

1
2
3
4
5
6
7
8
9
10
11
public int intId
    {
        get
        {
            return intId;
        }
        set
        {
            intId = value;
        }
    }

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

  • 您的字段应该有一个private修饰符,而不是static,否则使用它是没有意义的,因为它可能是从外部来源更改的。

  • 他们都有相同的名字,改变它。

  • 像这样:

    2


    第一个是静态字段,它甚至不是一个属性。

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

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

    在这个例子中,如果它是一个属性或字段,它不会有很大的区别。但从长远来看,如果在接口中使用属性,稍后可能会将其更改为具有实际的getter和setter,例如,验证或使对象对新值做出某种反应。字段只是一个字段,您不能控制它的设置时间和设置方式并对其做出反应。