You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C#运行时可选参数的替代实现方案求助

解决方案:避免重载实现带动态默认值的LinkPair方法

方案1:使用可空值类型(int?)作为参数

这是最贴近你原本思路的实现方式,将参数类型改为可空int(int?),允许默认值为null,再在方法内部通过null合并运算符获取实际要使用的值:

void LinkPair(int? val = null) {
    int targetVal = val ?? GetLowestVal();
    // 后续逻辑:找到对应值的Item对并链接
    var itemPair = FindPairByValue(targetVal);
    if (itemPair != null) {
        itemPair.First.Link(itemPair.Second);
    }
}

调用时既可以不传参数(自动使用最低值),也可以传入具体int值:

LinkPair(); // 链接值最低的一对Item
LinkPair(3); // 链接值为3的一对Item

方案2:使用特殊标记值作为默认参数

如果不想使用可空类型,可以选择一个业务逻辑中不可能出现的int值作为默认标记(比如int.MinValue),在方法内判断后替换为动态默认值:

void LinkPair(int val = int.MinValue) {
    int targetVal = val == int.MinValue ? GetLowestVal() : val;
    // 后续逻辑同上
}

注意:这种方式要求你确认业务场景中不会出现int.MinValue作为Item的val值,否则会触发错误逻辑。

方案3:参数对象模式(适合多变体扩展)

针对你提到的「后续可能会有很多变体」的场景,推荐使用参数对象模式——将所有可选参数封装到一个类中,后续扩展参数时无需修改方法签名或新增重载:

首先定义参数类:

public class LinkPairSettings {
    public int? TargetValue { get; set; }
    // 后续可添加更多参数,例如:
    // public bool AllowDuplicateLinks { get; set; } = false;
    // public LinkPriority Priority { get; set; } = LinkPriority.Lowest;
}

然后实现LinkPair方法:

void LinkPair(LinkPairSettings settings = null) {
    settings ??= new LinkPairSettings();
    int targetVal = settings.TargetValue ?? GetLowestVal();
    // 后续逻辑同上
}

调用方式灵活,且后续扩展参数时无需改动方法:

// 默认逻辑
LinkPair();
// 指定目标值
LinkPair(new LinkPairSettings { TargetValue = 5 });
// 后续扩展参数后直接使用
LinkPair(new LinkPairSettings { 
    TargetValue = 5, 
    AllowDuplicateLinks = true 
});

内容的提问来源于stack exchange,提问作者Kentalian

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 12:15:41