2016-02-19 68 views
1

我想將別人的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的'一個新實例'在啓動時,你會得到該實例的參考。 –

回答

0

這是否每次從類

沒有請求屬性時返回一個新cpCollisionHandler對象,程序instanciates場一次,第一次的類加載

它是否在第一次訪問屬性時返回一個新對象,然後對每個後續請求使用與該cpCollisionHandler相同的引用?

是的,它是爲每個請求

+1

這是相同的參考,但它是在加載類時創建的,而不是第一次訪問靜態成員時創建的。在某些情況下,這可能是一個重要的區別。 –

0

相同的參考這實際上不在類級別的屬性,但一個字段,即一個「可變的」。字段沒有像屬性那樣的getter或setter,但其行爲與局部變量完全相同,它們只是具有不同的作用域。

cpCollisionHandler對象在運行時第一次加載類時生成,直到應用程序終止或某些其他值分配給cpCollisionHandlerDefault字段。

+0

C#中的屬性有些不同,在這種情況下,正確的術語是字段。 –

+1

屬性意味着完全不同的東西,例如'[Serializable]'是一個屬性。 OP所擁有的是「場」。 –

+0

是的,我混淆了這個詞並糾正了答案。 – NineBerry

1

你有一點混淆起來。這是一個類型爲cpCollisionHandler的靜態變量cpCollisionHandlerDefault,它由新實例化...靜態實例化在所有其他代碼執行之前發生並且該變量可用於整個應用程序的運行。

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 
); 
+0

謝謝。非常明確的解釋。額外投票表達體會員提示。 – Garry

相關問題