繁体   English   中英

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

[英]Multiple strings vs Dictionary of strings as method parameters

我有一些采用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)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM