2009-10-17 88 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