首页 > 后端开发 > C++ > 为什么 C# 扩展方法中'ref”不能与'this”参数一起使用(C# 7.2 之前)?

为什么 C# 扩展方法中'ref”不能与'this”参数一起使用(C# 7.2 之前)?

Patricia Arquette
发布: 2025-01-07 16:41:43
原创
312 人浏览过

Why Can't

C# 扩展方法和“ref”修饰符:理解“this”参数的细微差别

C# 扩展方法通过新功能增强现有类型,而无需更改其原始代码。 然而,当将 ref 修饰符与 this 参数一起使用时,会出现一个关键的区别,特别是关于它如何影响正在扩展的实例。

ref 扩展方法参数中的修饰符

扩展方法可以接受由ref修改的参数,从而允许更改原始值。 考虑:

<code class="language-csharp">public static void Modify(ref int x, int y) { x = y; }</code>
登录后复制

这是有效的,因为 ref 修改了常规参数。

ref this

的限制

ref 应用于 this 参数时会出现限制:

<code class="language-csharp">public static void ModifyExtension(this ref int x, int y) { x = y; } //Compiler Error</code>
登录后复制

这会生成编译器错误。

历史背景(C# 7.2 之前)

在 C# 7.2 之前,此限制源于编译器限制。编译器以不同方式处理 this 参数,从而阻止 ref 语义。

C# 7.2 及更高版本:启用 ref this

C# 7.2 解决了这个限制。 现在,ref 可以与 this 参数一起使用,特别有利于修改值类型(结构)。

实际应用:修改结构

在使用结构时,此功能被证明是非常宝贵的,可以在扩展方法中进行就地修改。 例如:

<code class="language-csharp">public struct MyData
{
    public string Value { get; set; }
}

public static class MyDataExtensions
{
    public static void UpdateValue(this ref MyData data, string newValue)
    {
        data.Value = newValue;
    }
}</code>
登录后复制

这里,UpdateValue直接改变Value结构体的MyData属性。 这避免了创建新的结构体实例,从而提高了性能。

以上是为什么 C# 扩展方法中'ref”不能与'this”参数一起使用(C# 7.2 之前)?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板