在 MSDN 中,“对于引用类型,如果您需要从基类型转换为派生类型,则需要显式强制转换”。
在 wiki 中,“在编程语言理论中,引用类型是指代内存中对象的数据类型。另一方面,指针类型指的是内存地址。引用类型可以被认为是隐式取消引用的指针。”在 C 中就是这种情况。
在C#中考虑对引用类型进行显式转换时,如何解释内存存储过程?
最佳答案
在大多数情况下,引用变量和指针变量之间确实没有太大的区别。两者都指向内存中的一个位置。引用(或指针)变量的类型告诉编译器可以使用它执行哪些操作。
首先考虑 C++ 对象指针,而不是(主要)与基本类型(如 int 或 byte)一起使用的 C 指针。它实际上与 C# 中几乎相同:
MyBaseClass* a = new MyBaseclass();
a->BaseMethod(); // Call method using -> operator (dereference and call)
MyBaseClass* b = new MyDerivedClass();
b->DerivedMethod(); // Error: MyBaseClass has no such method
// Proper C++-Style casting.
MyDerivedClass* c = dynamic_cast<MyDerivedClass*>(b);
// Shortcut to the above, does not do the type test.
// MyDerivedClass* c = (MyDerivedClass*)b;
c->DerivedMethod(); // Ok
这几乎是 1:1 转换为 C#,因此引用类型(从程序员的角度来看)只是具有已定义类型的指针。唯一可见的区别是 C# 中的直接 C 风格转换等同于 C++ 中的 try_cast,这将确保您永远不会将错误的目标实例分配给引用变量。
因此,引用类型和指向对象的指针之间的区别是(其中大部分隐含在 C# 是托管语言这一事实中):
- 引用变量永远不能指向无效内存(指向 NULL 除外)。
- 引用变量永远不能指向与其类型不同的对象。
- 为引用变量赋值时,总是会测试类型。
- 对引用变量的转换需要检查目标对象是否属于给定类型。
关于c# - C# 中引用类型在内存方面的显式强制转换解释,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40298290/