c# - C# 中引用类型在内存方面的显式强制转换解释

标签 c# c++ c casting reference

在 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/

相关文章:

javascript - 将 IJavaScriptExecutor 执行脚本结果分配给局部变量

c# - 在运行时将委托(delegate)转换为 Action<T> 或 Func<T>

c# - 使用 C# 将消息以 ASCII 形式写入 MQ

c++ - Qt QAction 动态数组连接

c - 使用 1 int 发送 2 个数字

c# - 跨表分区的事务性插入

c++ - 在 C++ Vector<custom_class> 中搜索值的第一次/最后一次出现

c++ - 是否可以非法更改 CLASS 的 PRIVATE 数据成员?

C - 大小为 1 的无效读取

c - 将变量放在标题中与将变量放在源中之间的区别