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

问题描述:

我想将别人的C#代码移植到Xojo。有一类如下定义:有人可以解释这个C#静态类属性吗?

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

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

+0

它将创建cpCollisionHandle的'一个新实例'在启动时,你会得到该实例的参考。 –

这是否每次从类

没有请求属性时返回一个新cpCollisionHandler对象,程序instanciates场一次,第一次的类加载

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

是的,它是为每个请求

+1

这是相同的参考,但它是在加载类时创建的,而不是第一次访问静态成员时创建的。在某些情况下,这可能是一个重要的区别。 –

相同的参考这实际上不在类级别的属性,但一个字段,即一个“可变的”。字段没有像属性那样的getter或setter,但其行为与局部变量完全相同,它们只是具有不同的作用域。

cpCollisionHandler对象在运行时第一次加载类时生成,直到应用程序终止或某些其他值分配给cpCollisionHandlerDefault字段。

+0

C#中的属性有些不同,在这种情况下,正确的术语是字段。 –

+1

属性意味着完全不同的东西,例如'[Serializable]'是一个属性。 OP所拥有的是“场”。 –

+0

是的,我混淆了这个词并纠正了答案。 – NineBerry

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

这是一个静态字段,而不是属性。来自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 
); 
+0

谢谢。非常明确的解释。额外投票表达体会员提示。 – Garry