C# 函数参数数组与列表

C# function parameter Array vs List

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

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

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

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

你应该使用 IEnumerable,那么它可以是任何一个,因为 list and array 都实现了这个

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

它们还都实现了 IListICollection,这可能会提供其他有用的属性,如 Tim Schmelter 在评论中所示

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

Be conservative in what you do, be liberal in what you accept from others

换句话说,尽可能使用 "broadest" 类型,即继承层次结构中较高的类型,以便:

  1. 对用户的需求越少越好,
  2. 并给用户尽可能多的选择。

在这种情况下:

  • 如果您需要做的只是迭代参数集合,那么您应该向用户要求一个可以迭代的类型的实例:在本例中,它是 IEnumerable<T>
  • 如果您需要 add/remove 项,那么 ICollection<T> 将是最宽松的选择
  • 如果出于某种原因,您需要通过索引访问项目,那么您应该要求 IList<T>

一般来说,如果您只从序列中读取,我会使用 IEnumerable<T>

然而,在这个特定的上下文中,我会简单地使用 params string[] 甚至 params object[] 类型,因为那时你可以像 String.Format 一样使用它,即

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

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

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

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

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

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

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

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

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

任何拥有 IEnumerable<> 的人也可以轻松通过:

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

对我来说最好是超载。

除了 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;
}

所以如果你有一个 "static" 查询,你可以使用第一个重载(因为你在编译时知道参数的数量),而如果你有一个 "dynamic" 查询,你可以将第二个重载与 string[]List<string> 或 LINQ 表达式的结果一起使用。