C#中的结构泛型

0 c# struct unsafe

请帮我解决这个问题:

我尝试定义这样的结构:

 unsafe struct sNodo<T>
{    
        public T info;
        public sNodo<T>* sIzq;}
Run Code Online (Sandbox Code Playgroud)

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

我该怎么解决?我正在尝试使用动态内存创建一个"通用"堆栈.

感谢您的关注

Dav*_*ler 9

如果你只需要创建一个通用堆栈,那么你就不需要了unsafe.只需使用普通的C#语言:

class StackNode<T> {
    public T info;
    public StackNode<T> next;
}
Run Code Online (Sandbox Code Playgroud)

为什么你觉得你需要unsafe什么?

也许你认为你需要一个指针,因为否则你的类型不能拥有与数据成员相同类型的另一个实例.确实,在C#中,如果你尝试这样做:

struct Foo {
    int data;
    Foo next;
}
Run Code Online (Sandbox Code Playgroud)

... C#编译器会抱怨循环结构引用并拒绝编译你的代码(如果你不明白为什么必须这样做,试着弄清楚Foo对象应该在内存中占用多少字节).

但是如果你尝试用class关键字做同样的事情:

class Bar {
    int data;
    Bar next;
}
Run Code Online (Sandbox Code Playgroud)

......一切正常!如果你来自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.
}
Run Code Online (Sandbox Code Playgroud)

当然,这个C++代码并不完全等同,但它应该让您基本了解期望的内容.

一句话:如果您只是学习C#,请不要使用结构; 他们可以做的一切,课程也可以做.一旦理解了C#语义,并确保值语义结构可以为您提供性能优势,并确保该性能优势对您的应用程序真正重要,请继续使用它们.

  • 或者您可以使用Stack <T>而不是重新发明轮子:) (6认同)
  • 为什么你觉得你需要使用指针?"动态记忆"是什么意思? (2认同)