您现在的位置是:首页 > 编程 > 

C# 1 中的 OverloadResolutionPriorityAttribute

2025-07-18 20:04:25
C# 1 中的 OverloadResolutionPriorityAttribute C# 1 中的 OverloadResolutionPriorityAttributeIntroC# 1 引入了 params collection 的 feature,可以参考我们之前的介绍 C# 1 新特性 params collection,不过有一个问题,我们之前也有提到就是如果我们要针对

C# 1 中的 OverloadResolutionPriorityAttribute

C# 1 中的 OverloadResolutionPriorityAttribute

Intro

C# 1 引入了 params collection 的 feature,可以参考我们之前的介绍 C# 1 新特性 params collection,不过有一个问题,我们之前也有提到就是如果我们要针对原来的数组新增 ReadOnlySpan 的重载可能会发生破坏性的变更,原来调用数组方法可能会变成调用 ReadOnlySpan 的方法重载,所以后面引入了 OverloadResolutionPriorityAttribute 来控制方法重载解析的优先级这样开发者可以为原有的方法指定一个较高的优先级来保证不会 break,之前我们也提到过这个 attribute 不过之前编译器还没支持,现在已经支持了

OverloadResolutionPriorityAttribute

Attribute 定义如下:

代码语言:javascript代码运行次数:0运行复制
namespace System.Runtime.CompilerServices
{
    /// <summary>
    /// Specifies the priority of a member in overload resolution. When unspecified, the default priority is 0.
    /// </summary>
    [AttributeUsage(AttributeTargets.Method | AttributeTargets.Ctructor | AttributeTargets.Property, AllowMultiple = false, Inherited = false)]
    public sealed class OverloadResolutionPriorityAttribute : Attribute
    {
        /// <summary>
        /// Initializes a new instance of the <see cref="OverloadResolutionPriorityAttribute"/> class.
        /// </summary>
        /// <param name="priority">The priority of the attributed member. Higher numbers are prioritized, lower numbers are deprioritized. 0 is the default if no attribute is present.</param>
        public OverloadResolutionPriorityAttribute(int priority)
        {
            Priority = priority;
        }

        /// <summary>
        /// The priority of the member.
        /// </summary>
        public int Priority { get; }
    }
}

默认方法的 priority 是 0priority 越大优先级越高

Sample

来看个使用示例吧,首先我们回顾一下 params collection 里的用法

代码语言:javascript代码运行次数:0运行复制
int[] numbers = [1, 2, , 4];
Printumbers(numbers);

ReadOnlySpan<int> numbersSpan = numbers.AsSpan();
Printumbers(numbersSpan);

Printumbers(1, 2, );
Printumbers([1, 2, ]);

这里有两个 Printumbers 的方法,参数分别是数组和 ReadOnlySpan,定义如下:

代码语言:javascript代码运行次数:0运行复制

private static void Printumbers(params int[] numbers)
{
    Cole.WriteLine("Printumbers in Array overload");
    foreach (var item in numbers)
    {
        Cole.WriteLine(item);
    }
}

private static void Printumbers(params ReadOnlySpan<int> numbers)
{
    Cole.WriteLine("Printumbers in ReadOnlySpan overload");
    foreach (var item in numbers)
    {
        Cole.WriteLine(item);
    }
}

输出结果如下:

output

我们来说明一下输出结果,前面两个分别输出了 Array overload 和 ReadOnlySpan overload,因为我们传了具体的类型,所以编译器会优先类型匹配的重载,所以分别到了 Array 和 ReadOnlySpan 的方法重载

接着后面的两个调用使用 params collection 特性,因为没有指定特定的类型,所以编译器优先选择了 ReadOnlySpan 的重载来尽量使用性能更好的版本

接着我们来添加一个 OverloadResolutionPriorityAttribute 试一下, 我们来新加两个方法以便于和之前的代码对比

代码语言:javascript代码运行次数:0运行复制
[OverloadResolutionPriority(1)]
private static void Printumbers1(params int[] numbers)
{
    Cole.WriteLine("Printumbers1 in Array overload");
    foreach (var item in numbers)
    {
        Cole.WriteLine(item);
    }
}

private static void Printumbers1(params ReadOnlySpan<int> numbers)
{
    Cole.WriteLine("Printumbers1 in ReadOnlySpan overload");
    foreach (var item in numbers)
    {
        Cole.WriteLine(item);
    }
}

这里我们针对数组的方法重载添加了一个 OverloadResolutionPriority(1) 的 attribute,我们再来测试一下

代码语言:javascript代码运行次数:0运行复制
Printumbers1(1, 2, );
Printumbers1([1, 2, ]);

输出结果如下:

OverloadResolutionPriority output

可以看到在添加了 attribute 之后,原来调用 ReadOnlySpan 方法重载的变成了调用数组方法重载

More

OverloadResolutionPriorityAttribute 可以帮助我们告诉编译器选择符合预期的方法重载,应该只在发生重载冲突的时候再考虑使用,非必要不使用,使用了之后最好也要添加一些测试用例来验证是按照自己的预期工作的避免多个 overload 同时使用多个 priority 造成不符合预期的结果

References
  • .0.0-rc.1.2441.7/src/libraries/System.Private.CoreLib/src/System/Runtime/CompilerServices/
  • .0/
  • .cs
  • C# 1 新特性 params collection
本文参与 腾讯云自媒体同步曝光计划,分享自。原始发表:2024-09-2,如有侵权请联系 cloudcommunity@tencent 删除测试数组c#numbers编译器

#感谢您对电脑配置推荐网 - 最新i3 i5 i7组装电脑配置单推荐报价格的认可,转载请说明来源于"电脑配置推荐网 - 最新i3 i5 i7组装电脑配置单推荐报价格

本文地址:http://www.dnpztj.cn/biancheng/1130069.html

相关标签:无
上传时间: 2025-07-18 16:32:17
留言与评论(共有 5 条评论)
本站网友 旭辉御锦
26分钟前 发表
2
本站网友 千色
30分钟前 发表
); Printumbers1([1
本站网友 长胡子
7分钟前 发表
我们再来测试一下代码语言:javascript代码运行次数:0运行复制Printumbers1(1
本站网友 arrowhead
25分钟前 发表
可以参考我们之前的介绍 C# 1 新特性 params collection