我正在尝试将其他人的C#代码移植到Xojo。一个类中有以下定义:
static cpCollisionHandler cpCollisionHandlerDefault = new cpCollisionHandler(
cp.WILDCARD_COLLISION_TYPE, cp.WILDCARD_COLLISION_TYPE,
DefaultBegin, DefaultPreSolve, DefaultPostSolve, DefaultSeparate, null
);
我知道这是静态变量,可以从类中返回而不实例化它。我也明白它是一个名为cpCollisionHandlerDefault
的属性,它返回一种cpCollisionHandler
类型。我不确定的是,每次从类请求属性时返回新 cpCollisionHandler
对象,或者在第一次访问属性时它返回一个新对象每个后续请求对cpCollisionHandler
的引用是否相同?
答案 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字段为止。