请帮我解决这个问题:
我尝试定义这样的结构:
unsafe struct sNodo<T>
{
public T info;
public sNodo<T>* sIzq;}
Run Code Online (Sandbox Code Playgroud)
但我收到此错误:无法获取地址,获取大小,或声明指向托管类型sNodo的指针,
我该怎么解决?我正在尝试使用动态内存创建一个"通用"堆栈.
感谢您的关注
如果你只需要创建一个通用堆栈,那么你就不需要了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#语义,并确保值语义结构可以为您提供性能优势,并确保该性能优势对您的应用程序真正重要,请继续使用它们.