請幫我解決這個問題:結構泛型
我嘗試這樣定義的結構:
unsafe struct sNodo<T>
{
public T info;
public sNodo<T>* sIzq;}
,但我得到這個錯誤:無法獲取的地址,獲取的大小,或者聲明指向託管類型的指針sNodo,
我該如何解決它? 我想創建一個使用動態內存的「通用」堆棧。
感謝您的關注
請幫我解決這個問題:結構泛型
我嘗試這樣定義的結構:
unsafe struct sNodo<T>
{
public T info;
public sNodo<T>* sIzq;}
,但我得到這個錯誤:無法獲取的地址,獲取的大小,或者聲明指向託管類型的指針sNodo,
我該如何解決它? 我想創建一個使用動態內存的「通用」堆棧。
感謝您的關注
如果你需要的是創建一個通用的堆棧,你不需要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#語義,並且確信價值語義結構可以爲您提供性能優勢,並確信該性能優勢實際上對您的應用程序至關重要,請繼續使用它們。
變老了。我認爲OP只是誤解了值類型和引用類型(結構和類在這裏)的用法。 – Noldorin 2009-10-17 00:10:55
或者你可以使用堆棧
因爲我需要使用指針(dinamic內存)。 – 2009-10-17 01:10:57
「因爲我需要使用指針(dinamic memory)。」......呃 - 爲什麼?這不足以解釋你正在嘗試做什麼。 – 2009-10-17 07:47:38