2009-10-17 87 views
0

請幫我解決這個問題:結構泛型

我嘗試這樣定義的結構:

unsafe struct sNodo<T> 
{  
     public T info; 
     public sNodo<T>* sIzq;} 

,但我得到這個錯誤:無法獲取的地址,獲取的大小,或者聲明指向託管類型的指針sNodo,

我該如何解決它? 我想創建一個使用動態內存的「通用」堆棧。

感謝您的關注

+0

「因爲我需要使用指針(dinamic memory)。」......呃 - 爲什麼?這不足以解釋你正在嘗試做什麼。 – 2009-10-17 07:47:38

回答

9

如果你需要的是創建一個通用的堆棧,你不需要unsafe。只需使用正常的C#語言:

class StackNode<T> { 
    public T info; 
    public StackNode<T> next; 
} 

爲什麼你覺得你需要unsafe

也許你認爲你需要一個指針,否則你的類型不能有與數據成員相同類型的另一個實例。事實上,在C#中,如果你嘗試這樣做:

struct Foo { 
    int data; 
    Foo next; 
} 

... C#編譯器會抱怨圓形結構的引用,並拒絕編譯代碼(如果你不明白爲什麼它要做到這一點,嘗試找出Foo對象應該在內存中佔用多少字節)。

但如果你試圖做同樣的事情與class關鍵字:

class Bar { 
    int data; 
    Bar next; 
} 

...一切正常!如果你來自C++背景,那裏的類和結構或多或少都是一樣的東西,這是非常令人費解的。

祕訣在於,在C#中,結構體具有值語義,而類具有引用語義。因此,C++,以上兩個定義最相似的:

class Foo { 
    int data; 
    Foo next; // This doesn't compile in C++ either. 
} 

class Bar { 
    int data; 
    Bar* next; // But this is ok. 
} 

這個C++代碼是不是完全等同的,當然,但它應該給你什麼樣的期待有了基本的瞭解。底線:如果您剛剛學習C#,請不要使用結構;如果您只是在學習C#,請不要使用結構;如果您只是在學習C#,請不要使用結構;如果您只是在學習C#,請不要使用結構。他們可以做的一切,班級也可以做。一旦理解了C#語義,並且確信價值語義結構可以爲您提供性能優勢,並確信該性能優勢實際上對您的應用程序至關重要,請繼續使用它們。

+0

變老了。我認爲OP只是誤解了值類型和引用類型(結構和類在這裏)的用法。 – Noldorin 2009-10-17 00:10:55

+6

或者你可以使用堆棧而不是重新發明輪子:) – 2009-10-17 00:16:47

+0

因爲我需要使用指針(dinamic內存)。 – 2009-10-17 01:10:57