除了按值和引用,方法参数的第三种传递方式 - Artech

💡 原文中文,约2800字,阅读约需7分钟。
📝

内容提要

.NET规定的参数传递形式有三种:按值传递、按引用传递和TypedReference结构体。按值传递是传递参数的值或拷贝,对于值类型传递字节,对于引用类型传递地址。按引用传递是传递变量所在位置,可以改变原始值。TypedReference是强类型的引用,在按引用传递的基础上传递参数类型。TypedReference结构体有一系列静态方法完成基本操作。还有三个特殊方法:__makeref创建TypedReference对象,__reftype获取引用的目标类型,__refvalue获取和设置引用的值。

🔎

延伸解读

TypedReference 的强类型特性

TypedReference 在按引用传递的基础上额外携带了参数的类型信息,这使得它成为强类型引用。与普通按引用传递只传递地址不同,TypedReference 通过 _type 字段记录目标类型,从而在运行时可以验证类型安全。这种设计允许方法在修改引用值的同时,确保操作符合原始类型约束,避免了类型不匹配的风险。

三个特殊方法的用途

__makeref、__reftype 和 __refvalue 是操作 TypedReference 的关键。__makeref 用于创建 TypedReference 对象,__reftype 获取引用的目标类型,__refvalue 则用于读取或设置引用的值。这些方法在常规开发中较少见,但在需要动态操作引用并保持类型信息的场景下非常有用,例如实现泛型算法或反射相关的底层操作。

三种传递方式的适用场景

按值传递适用于不希望修改原始数据的场景,对于值类型传递字节拷贝,引用类型传递地址拷贝。按引用传递允许方法修改原始变量,适用于需要输出参数或交换值的场景。TypedReference 则适用于需要同时传递引用和类型信息的特殊场景,如动态语言运行时或需要类型安全的引用操作。开发者应根据具体需求选择合适的方式。

❓

Q&A

.NET支持哪三种参数传递方式?

.NET支持按值传递、按引用传递和TypedReference结构体传递三种方式。

按值传递和按引用传递有什么区别?

按值传递是传递参数的值或拷贝,而按引用传递是传递变量所在的位置,可以改变原始值。

什么是TypedReference结构体?

TypedReference是强类型的引用,在按引用传递的基础上传递参数类型。

TypedReference结构体有哪些特殊方法?

TypedReference结构体有三个特殊方法:__makeref、__reftype和__refvalue。

如何创建一个TypedReference对象?

可以使用__makeref方法创建一个新的TypedReference对象。

在什么情况下使用按引用传递?

按引用传递适用于需要在方法中修改原始值的情况。

➡️

继续阅读