gpt4 book ai didi

c# - "Ternary"不同方法签名的运算符

转载 作者:行者123 更新时间:2023-11-30 14:39:21 28 4
gpt4 key购买 nike

我正在寻找一种优雅的方式来选择方法签名(重载)并根据条件传递参数。我有一个导入器,它要么生成要导入的最新文件,要么采用显式数据路径。

目前我的代码如下所示:

if (string.IsNullOrEmpty(arguments.File))
{
importer.StartImport();
}
else
{
importer.StartImport(arguments.File);
}

我希望它看起来像这样(或概念上相似):

importer.StartImport(string.IsNullOrEmpty(arguments.File) ? Nothing : arguments.File);

这个想法是调用不同的方法签名。一些规定:

1) 我不会依赖“null”来指示未指定的文件(即除了 null 本身之外的任何文件)。
2)我不会将参数结构传递给导入器类;这违反了单一责任原则。

我知道的一个解决方案是只有一个 StartImport() 方法接受单个字符串,此时该方法解析条件并选择如何继续。我目前选择避免使用此解决方案,因为它只会将 if 语句从一种方法移动到另一种方法。我问这个问题是因为:

1) 我想将“8行”代码减少到1行。
2) 我真的很好奇 C# 是否有能力做这样的事情。

最佳答案

I would like to reduce "8 lines" of code to 1.

我认为你问错了问题。重要的不是你有多少行代码,而是它们的清晰程度、可维护性和可调试性。根据您的描述,从默认位置导入和使用已知文件导入语义上不同 - 所以我认为您将它们分为两个不同的重载是正确的。事实上,您可能想更进一步,实际上以不同的方式命名它们以进一步阐明差异。

I'm genuinely curious if C# is capable of something like this.

当然,我们可以使用各种花哨的语言技巧来使其更加紧凑......但我不认为它们使代码更加清晰。例如:

// build a Action delegate based on the argument...
Action importAction = string.IsNullOrEmpty(arguments.File)
? () => importer.StartImport()
: () => importer.StartImport(arguments.File)
importAction(); // invoke the delegate...

上面的代码使用了 lambda + closure创建一个正确类型的 Action 委托(delegate),然后调用该委托(delegate)。但这还不太清楚......它的效率也稍低,因为它需要创建一个委托(delegate),然后通过该委托(delegate)调用该方法。在大多数情况下,性能开销完全可以忽略不计。这里真正的问题是闭包的使用 - 很容易误用带有闭包的代码 - 并且完全有可能 introduce bugs通过使用 closures incorrectly .

关于c# - "Ternary"不同方法签名的运算符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6553879/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com