多个字符串与字符串字典作为方法参数

时间:2014-07-24 16:54:45

标签: c# performance dictionary

我有一些方法需要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);
}

我的问题是关于性能,可读性和代码简单性。

现在我使用多个字符串:我应该使用字典吗?

2 个答案:

答案 0 :(得分:3)

这取决于。功能是否需要所有20个参数?

如果是这样,请创建一个可以传递所有20个值的数据类型,并传入该数据类型的实例。您可以创建帮助程序类以轻松初始化该类型的对象。您可以轻松传入该数据类型的新实例,并提供初始化类型的灵活方法:

isNice(new niceParams
   {
      aux1 = "Foo",
      aux2 = "Bar"
      // ...
   }
);

如果没有,请将可选参数放在签名的末尾,并为其指定默认值。

public Boolean isNice(string req1, string req2, string optional1 = null)

这样,您就有了重载来准确指定要提供的值。

这样做的另一个好处是你可以使用named parameters来调用函数:

isNice(req1, req2, optional1: "Foo", optional15: "Bar");

话虽如此,我会使用字典。它强制调用者理解签名,并完全破坏任何编译器类型。如果没有提供所需的值,该怎么办?如果密钥拼写错误怎么办?所有这些检查现在必须在运行时完成,导致只能在运行时捕获的错误。对我来说,这似乎是在寻找麻烦。

答案 1 :(得分:2)

主要区别在于,如果您有20个string参数,编译器将确保显式设置所有参数,即使它们设置为null。在传递集合的情况下,编译器将无法检测到有人忘记设置aux17参数:使用基于字典的API的代码将继续编译,因此您将被迫添加在运行时额外检查。

如果您的代码没有编译器检查是正常的,例如,因为所有string值都是可选的,那么基于集合的方法更容易维护。

在实施更改之前,无法预测速度差异。基于集合的方法将执行额外的内存分配,因此会消耗更多的CPU周期。另一方面,差异可能太小而不会对您的计划的整体表现产生实际影响。

请注意,由于您的参数是统一命名的,因此可能会将它们放置在&#34; flat&#34;集合,而不是字典。例如,您可以使API获取列表或字符串数​​组。对于数组,您还可以使您的方法采用可变数量的参数,以便调用者可以使用旧语法来调用您的方法:

public bool isNice(params string[] args)