C#函数参数Array vs List

时间:2015-04-27 12:38:59

标签: c# arrays list function parameters

我正在编写一个简单的C#类来处理特定竞赛中的SQL查询。大多数查询都是SELECT语句,有3-4个参数应该正确转义,所以函数将是这样的

public DataTable Select(string query, string[] parameters) {
    # some code
}

parameters应该是Array还是List<>?在将这两种类型作为函数参数进行选择时是否存在一些最佳实践?还是仅仅是偏好问题?

P.S。我通常更喜欢List<>,因为它具有灵活性但是在这里创建Array的可能性是一个很好的观点。

6 个答案:

答案 0 :(得分:11)

您应该使用IEnumerable,然后它可以是listarray实现此

public DataTable Select(string query, IEnumerable<string> parameters)

他们还实施IListICollection,这可能会提供Tim Schmelter在评论中显示的其他有用属性

答案 1 :(得分:3)

根据Robustness principle, or Postel's law(强调我的):

  

在你所做的事情上要保守,在你接受别人的事情上要自由

换句话说,使用“最广泛”类型,继承层次结构中更高的类型,以便:

  1. 要求用户尽可能少,
  2. 并为用户提供尽可能多的选择。
  3. 在这种情况下:

    • 如果你需要做的就是遍历参数集合,那么你应该向用户要求一个可以迭代的类型的实例:在这种情况下,它是IEnumerable<T>
    • 如果您需要添加/删除项目,那么ICollection<T>将是最自由的选项
    • 如果由于某种原因,您需要按索引访问项目,那么您应该要求IList<T>

答案 2 :(得分:2)

除了nvoig所说的,我会:

public DataTable Select(string query, params string[] parameters)
{
    return Select(query, (IEnumerable<string>)parameters);
}

public DataTable Select(string query, IEnumerable<string> parameters)
{
    return null;
}

这样,如果你有一个&#34;静态&#34;查询,你可以使用第一个重载(因为你知道在编译时参数的数量),而如果你有一个&#34;动态&#34;查询您可以使用string[]List<string>的第二个重载或LINQ表达式的结果。

答案 3 :(得分:1)

就个人而言,我希望至少有一个重载让我能够传递一个params数组:

public DataTable Select(string query, params string[] parameters);

这将允许我用这样的参数调用它:

Select("SELECT FROM WHERE", "3", "17", "Joe");

任何拥有IEnumerable<>的人都可以轻松传递它:

Select("SELECT FROM WHERE", myData.ToArray());

对我来说,这样做会更好。

答案 4 :(得分:0)

一般情况下,如果您只阅读序列,我会使用IEnumerable<T>

在这个特定的上下文中,我只使用params string[]或甚至params object[]类型,因为您可以像String.Format一样使用它,即

var dt = Select("select A from Table where X=? and Y=?", value1, value2);

答案 5 :(得分:0)

如果您的参数具有相同的类型(此处为字符串),则可以将params关键字与字符串数组一起使用。

public DataTable Select(string query, params string[] parameters) 

因此你可以像下面那样调用它

Select(myQuery, param1, param2, ...);