请帮我解决这个问题:
我尝试定义这样的结构:
unsafe struct sNodo<T>
{
public T info;
public sNodo<T>* sIzq;}
但我收到此错误:无法获取托管类型 sNodo 的地址、大小或声明指向托管类型 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# 语义,并确定值语义结构可以为您提供性能优势,并确定该性能优势对您的应用程序确实很重要,请继续使用它们。