有人可以解释这个C#静态类属性吗?

时间:2016-02-19 20:49:06

标签: c# syntax chipmunk

我正在尝试将其他人的C#代码移植到Xojo。一个类中有以下定义:

static cpCollisionHandler cpCollisionHandlerDefault = new cpCollisionHandler(
         cp.WILDCARD_COLLISION_TYPE, cp.WILDCARD_COLLISION_TYPE,
       DefaultBegin, DefaultPreSolve, DefaultPostSolve, DefaultSeparate, null
    );

我知道这是静态变量,可以从类中返回而不实例化它。我也明白它是一个名为cpCollisionHandlerDefault的属性,它返回一种cpCollisionHandler类型。我不确定的是,每次从类请求属性时返回 cpCollisionHandler对象,或者在第一次访问属性时它返回一个新对象每个后续请求对cpCollisionHandler的引用是否相同?

4 个答案:

答案 0 :(得分:1)

你有点混淆了。这是一个cpCollisionHandler类型的静态变量cpCollisionHandlerDefault,它由new实例化...静态实例化在所有其他代码执行之前发生,并且该变量可用于整个app运行。

答案 1 :(得分:1)

这是一个静态字段,而不是属性。来自documentation

  

静态字段确切地标识一个存储位置。无论创建了多少个类实例,都只有一个静态字段的副本。

因此它只被一次实例化,并且每次访问时都会返回一个新对象。

使用C#6.0, 可以在每次访问静态字段时返回一个新对象,并使用expression-bodied member进行轻微语法修改:

static cpCollisionHandler cpCollisionHandlerDefault => new cpCollisionHandler(
     cp.WILDCARD_COLLISION_TYPE, cp.WILDCARD_COLLISION_TYPE,
   DefaultBegin, DefaultPreSolve, DefaultPostSolve, DefaultSeparate, null
);

答案 2 :(得分:0)

  

每次从类中请求属性时都返回一个新的cpCollisionHandler对象

不,程序会在第一次加载类时实例化该字段

  

第一次访问该属性时是返回一个新对象,然后是每个后续请求对该cpCollisionHandler的相同引用吗?

是的,每个请求都是相同的参考

答案 3 :(得分:0)

这实际上不是属性而是字段,即类级别的“变量”。字段没有像属性一样的getter或setter,但行为与局部变量完全相同,它们只有不同的范围。

cpCollisionHandler对象是在运行时第一次加载类时创建的,直到应用程序终止或其他值分配给cpCollisionHandlerDefault字段为止。