请帮我解决这个问题:结构泛型
我尝试这样定义的结构:
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