C# 扩展方法:为什么第一个参数不能是 ref
(大多数)
扩展方法可以优雅地向现有类型添加功能,而无需更改其源代码。 但是,存在一个关键限制:第一个参数(表示方法所操作的实例)不能是 ref
参数(下面指出的例外情况)。
限制背后的原因
ref
关键字允许方法直接修改作为参数传递的变量的值。在标准方法调用中,这是完全可以接受的。但对于扩展方法,第一个参数隐式表示调用扩展的对象。 设置此参数ref
将从根本上改变扩展方法的工作方式。
扩展方法扩展类型的行为;它不会替换或创建新实例。 在第一个参数上允许使用 ref
参数将有效地让扩展方法用完全不同的对象替换原始对象,从而打破了扩展方法的核心概念。
说明性示例
考虑常规方法:
<code class="language-csharp">public static void Modify(ref MyClass obj, MyClass newObj) { obj = newObj; //Directly replaces the original object }</code>
现在,想象一个类似的扩展方法(假设允许):
<code class="language-csharp">public static void ModifyExtension(this ref MyClass obj, MyClass newObj) { obj = newObj; //Would replace the original object }</code>
这个假设的扩展方法不会修改原始的obj
,而是将一个新对象分配给引用它的变量。这种行为与扩展方法的预期目的不一致。
C# 7.2 和值类型:异常
虽然该限制通常适用于引用类型(类、接口),但 C# 7.2 引入了值类型(结构)的例外。 对于结构,在第一个参数 ref
上使用 是 允许的。
这允许创建可以修改结构内部状态的扩展方法。 但是,请务必记住此异常仅适用于值类型,而不适用于引用类型。 保留原始实例的核心原则仍然适用于引用类型。
以上是为什么 C# 扩展方法的第一个参数不能是'ref”参数?的详细内容。更多信息请关注PHP中文网其他相关文章!