多个字符串vs字符串字典作为方法参数
本文关键字:字符串 方法 参数 字典 vs | 更新日期: 2023-09-27 18:14:44
我有一些方法接受20或更多的字符串作为参数。我想知道哪种方法更好:传递20个字符串参数到方法或将它们全部放在字典中并将其作为唯一参数传递。
多个字符串:
public Boolean isNice(string aux, string aux2, string aux3, string aux4, string aux5, string aux6, string aux7,
string aux8, string aux9, string aux10, string aux11, string aux12, string aux13, string aux14, string aux15, string aux16)
{
string foo1 = aux;
string foo2 = aux2;
// etc
return true;
}
public void yeah()
{
string aux = "whatever";
string aux2 = "whatever2";
// etc
isNice(aux, aux2, ..., ..., ...);
}
字符串字典
public Boolean isNice(Dictionary<string, string> aux)
{
string foo1 = aux["aux1"];
string foo2 = aux["aux2"];
// etc
return true;
}
public void yeah()
{
string aux = "whatever";
string aux2 = "whatever2";
// etc
Dictionary<string, string> auxDict = new Dictionary<string,string>();
auxDict.Add("key1", aux);
auxDict.Add("key2", aux2);
// etc
isNice(auxDict);
}
我的问题是关于性能,可读性和代码的简单性。
现在我使用多个字符串:我应该用字典代替吗?
这要看情况。是否所有20个参数都是函数工作所必需的?
如果是,创建一个可以通信所有20个值的数据类型,并传入该数据类型的实例。您可以创建辅助类来轻松地初始化该类型的对象。您可以很容易地传入该数据类型的新实例,并提供灵活的方法来初始化该类型:
isNice(new niceParams
{
aux1 = "Foo",
aux2 = "Bar"
// ...
}
);
如果没有,则将可选参数放在签名的末尾,并为其提供默认值。
public Boolean isNice(string req1, string req2, string optional1 = null)
通过这种方式,您可以重载来精确指定您想要提供的值。
这样做的另一个好处是您可以使用命名参数来调用函数:isNice(req1, req2, optional1: "Foo", optional15: "Bar");
尽管如此,我还是会而不是使用字典。它强制调用者理解签名,并完全安全地破坏任何编译器类型。如果没有提供所需的值怎么办?如果一个键拼错了怎么办?所有这些检查现在都必须在运行时完成,从而导致只能在运行时捕获的错误。在我看来,这似乎是自找麻烦。
主要区别在于,如果您有20个string
参数,编译器将确保所有参数都被显式设置,即使它们被设置为null
。在传递一个集合的情况下,编译器将无法检测到有人忘记设置aux17
参数:使用基于字典的API的代码将继续编译,因此您将被迫在运行时添加额外的检查。
如果您的代码没有编译器检查是可以的,例如,因为所有的string
值都是可选的,那么基于集合的方法更容易维护。
在实现更改之前,无法预测速度的差异。基于集合的方法将执行额外的内存分配,因此它将消耗更多的CPU周期。另一方面,差异可能太小,不会对程序的整体性能产生真正的影响。
请注意,由于参数是统一命名的,因此它们似乎可以放在"平面"集合中,而不是放在字典中。例如,您可以创建一个接受字符串列表或数组的API。对于数组,还可以让方法接受可变数量的参数,以便调用者可以使用旧语法调用方法:
public bool isNice(params string[] args)