2011-11-20 14 views
4

有誰知道使用ref 關鍵字即當傳遞給使用ref關鍵字的方法時,結構是否被裝箱?

struct Test 
{ 
    public int Value; 
} 

static void Main() 
{ 
    Test test = new Test(); 
    SomeMethod(ref test); 
    System.Diagnostics.Debug.WriteLine(test.Value); 
} 

static void SomeMethod(ref Test test) 
{ 
    test.Value = 5; 
} 
當結構被傳遞給方法如果發生拳擊

我想用一個結構的類型,但我有幾個方法需要 更改。如果它裝箱,我會傳遞它並返回它,或者也可以使用類。

+2

*爲什麼*你想「使用結構」?特別是,可變結構是邪惡的...... –

+0

@Jon there *有些場景中,濫用通過-ref傳遞的可變結構可能非常有用......但非常黑暗的一面。事實上,如果你不得不提出這個問題,你可能會不恰當地使用它。 –

+0

@MarcGravell:確實:)對於幾乎每一個「你幾乎都不應該這樣做」的規則,也有例外。 –

回答

2

將不會有拳擊,但它聽起來像你應該使用一個類。
對於結構的最好的建議是,他們應該被設計成不可變的,所以

  • 爲什麼在首位struct
  • 爲什麼切換到複製&返回以避免拳擊?你認爲速度更快嗎?
1

對於通過引用傳遞的內容,參數的聲明類型必須爲,正好與傳遞的內容的聲明類型相匹配。只有當值類型轉換爲聲明類型不是值類型的東西時纔會出現拳擊,因此與所討論的值類型不完全相同。

有些人可能不喜歡可變值類型,但通過引用傳遞可變值類型通常優於傳遞混雜引用的惡意做法。例如,考慮:

 
struct StructType1 {public int V; ... } 
class ClassType1 {public int V; ... } 

void blah() 
{ 
    StructType1 s1; 
    ClassType1 c1 = new ClassType1(); 
    ... do some stuff... 
    Routine1(s_pt, c_pt); 
    Routine2(ref s_pt, ref c_pt); 
    ... do more stuff 
} 

Routine1對S1.V有什麼影響?例程1對C1.V有什麼影響?

Routine2對S1.V有什麼影響?什麼時候會發生這種影響?用C1.V怎麼樣?特別是,有沒有什麼方法可以知道例行程序1或例程2是否可能導致C1.V在呼叫返回後的很長時間內在任意時間發生變化?

另外,假設S1保存一些我想存儲到類中的數據。如果S1只包含值類型(可能或不可變)和不可變引用類型,我是否需要擔心會意外更改存儲在那裏的數據?

現在假設它是保存我想存儲的數據的C1。如果C1是可變的,或者包含任何可變引用類型,並且已經將它暴露給任何外部函數,那麼我是否可以通過任何方式安全地存儲其中包含的信息,而無需瞭解有關C1內部的相當多的內容?

通過引用傳遞結構是允許其他函數提供多條信息而無需冗餘複製的一種優美方式。支持可變值類型對語言實現者來說可能是一種麻煩,但價值語義在生產代碼中非常有用,儘管在某些框架的實現中存在一些不幸的怪癖。

相關問題