0

请帮我解决这个问题:

我尝试定义这样的结构:

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

但我收到此错误:无法获取托管类型 sNodo 的地址、大小或声明指向托管类型 sNodo 的指针,

我该如何解决?我正在尝试使用动态内存创建一个“通用”堆栈。

感谢您的关注

4

1 回答 1

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# 语义,并确定值语义结构可以为您提供性能优势,并确定该性能优势对您的应用程序确实很重要,请继续使用它们。

于 2009-10-17T00:09:39.703 回答