C#中针对引用类型的内存的显式强制转换说明

迈克·刘

在MSDN中,“对于引用类型,如果需要从基本类型转换为派生类型,则需要显式强制转换”。

在Wiki中,“在编程语言理论中,引用类型是指内存中的对象的数据类型。另一方面,指针类型是指内存地址。可以将引用类型视为隐式取消引用的指针。 ” 在C中就是这种情况。

在C#中考虑显式转换为引用类型时如何解释内存存储过程?

PMF

在大多数情况下,引用变量和指针变量之间实际上并没有太大的区别。两者都指向内存中的位置。引用(或指针)变量的类型告诉编译器可以使用它执行哪些操作。

代替(主要)与基本类型(例如int或byte)一起使用的C指针,应首先考虑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-Style强制转换等效于C ++中的try_cast,这将确保您永远不会将错误的目标实例分配给引用变量。

因此,引用类型和指向对象的指针之间的区别是(C#是托管语言这一事实​​暗示了其中的大多数):

  • 引用变量永远不能指向无效的内存(NULL除外)。
  • 引用变量永远不能指向非其类型的对象。
  • 在为参考变量分配值时,始终会测试类型。
  • 引用变量的类型转换需要检查目标对象是否为给定类型。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章