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)
它们还都实现了 IList
和 ICollection
,这可能会提供其他有用的属性,如 Tim Schmelter 在评论中所示
根据 Robustness principle, or Postel's law(强调我的):
Be conservative in what you do, be liberal in what you accept from others
换句话说,尽可能使用 "broadest" 类型,即继承层次结构中较高的类型,以便:
- 对用户的需求越少越好,
- 并给用户尽可能多的选择。
在这种情况下:
- 如果您需要做的只是迭代参数集合,那么您应该向用户要求一个可以迭代的类型的实例:在本例中,它是
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 表达式的结果一起使用。
我正在编写一个简单的 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)
它们还都实现了 IList
和 ICollection
,这可能会提供其他有用的属性,如 Tim Schmelter 在评论中所示
根据 Robustness principle, or Postel's law(强调我的):
Be conservative in what you do, be liberal in what you accept from others
换句话说,尽可能使用 "broadest" 类型,即继承层次结构中较高的类型,以便:
- 对用户的需求越少越好,
- 并给用户尽可能多的选择。
在这种情况下:
- 如果您需要做的只是迭代参数集合,那么您应该向用户要求一个可以迭代的类型的实例:在本例中,它是
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 表达式的结果一起使用。