params c# 到底怎么用? 5
下面是从petshop里面的sqlhelper.cs里面截取的一段代码,但是为什么第一段用了params这个关键字了而第二个没用用呢?第一段:publicstaticob...
下面是从petshop里面的sqlhelper.cs里面截取的一段代码,但是为什么第一段用了params这个关键字了而第二个没用用呢?
第一段:
public static object ExecuteScalar(string connectionString, CommandType cmdType, string cmdText, params SqlParameter[] commandParameters) {
SqlCommand cmd = new SqlCommand();
using (SqlConnection connection = new SqlConnection(connectionString)) {
PrepareCommand(cmd, connection, null, cmdType, cmdText, commandParameters);
object val = cmd.ExecuteScalar();
cmd.Parameters.Clear();
return val;
}
第二段:
private static void PrepareCommand(SqlCommand cmd, SqlConnection conn, SqlTransaction trans, CommandType cmdType, string cmdText, SqlParameter[] cmdParms) {
if (conn.State != ConnectionState.Open)
conn.Open();
cmd.Connection = conn;
cmd.CommandText = cmdText;
if (trans != null)
cmd.Transaction = trans;
cmd.CommandType = cmdType;
if (cmdParms != null) {
foreach (SqlParameter parm in cmdParms)
cmd.Parameters.Add(parm);
}
各位朋友,我想了解的具体一点,就是说为什么第二段里面的 SqlParameter[] cmdParms 前面可不可以加params关键字?它为什么没有加?加了之后会有什么区别?params的定义是指定可变数目的参数,那么假如上面的第一段不加parms直接用一个SqlParmtemers[] params这个来定义可变参数不行么(反正SqlParmtemers[]数组的个数本来就不知道,可以在外部根据实际情况指定的啊)? 展开
第一段:
public static object ExecuteScalar(string connectionString, CommandType cmdType, string cmdText, params SqlParameter[] commandParameters) {
SqlCommand cmd = new SqlCommand();
using (SqlConnection connection = new SqlConnection(connectionString)) {
PrepareCommand(cmd, connection, null, cmdType, cmdText, commandParameters);
object val = cmd.ExecuteScalar();
cmd.Parameters.Clear();
return val;
}
第二段:
private static void PrepareCommand(SqlCommand cmd, SqlConnection conn, SqlTransaction trans, CommandType cmdType, string cmdText, SqlParameter[] cmdParms) {
if (conn.State != ConnectionState.Open)
conn.Open();
cmd.Connection = conn;
cmd.CommandText = cmdText;
if (trans != null)
cmd.Transaction = trans;
cmd.CommandType = cmdType;
if (cmdParms != null) {
foreach (SqlParameter parm in cmdParms)
cmd.Parameters.Add(parm);
}
各位朋友,我想了解的具体一点,就是说为什么第二段里面的 SqlParameter[] cmdParms 前面可不可以加params关键字?它为什么没有加?加了之后会有什么区别?params的定义是指定可变数目的参数,那么假如上面的第一段不加parms直接用一个SqlParmtemers[] params这个来定义可变参数不行么(反正SqlParmtemers[]数组的个数本来就不知道,可以在外部根据实际情况指定的啊)? 展开
展开全部
为了将方法声明为可以接受可变数量参数的方法,我们可以使用params关键字来声明数组,如下所示:
public static Int32Add(params Int32[] values)
{
Int32 sum = 0;
for (Int32 x = 0; x < values.Length; x++)
{
sum += values[x];
}
return sum;
}
只有方法的最后一个参数才可以标记params,该参数必须标识一个一维数组,但类型不限。对方法的最后一个参数传递null或者0个数目的数组的引用都是合法的,如下面代码调用上面Add方法,编译正常,运行正常,和期望一样结果为0:
public static void Main()
{
Console.WriteLine(Add());
}
下面看一下如何编写一个可以接受任意数量、任意类型的参数的方法,也就是把上面方法的Int32改成Object[]就可以了:
public static void Main()
{
DisplayTypes(new Object(), new Random(), "string", 10);
}
public static void DisplayTypes(params Object[] objects)
{
foreach(Object o in objects)
{
Console.WriteLine(o.GetType());
}
}
输出:
System.Object
System.Random
System.String
System.Int32
注意,对于可接受可变数量参数的方法的调用会对性能造成一定的损失,因为数组是在堆上分配的,数组的元素还得初始化,数组的内存还得被垃圾回收器回收,为了减少这种没必要的性能损失,我们希望定义几个没有params关键字的重载方法,如System.String类的Concat方法,如下:
public static string Concat(object arg0);
public static string Concat(params object[] args);
public static string Concat(params string[] values);
public static string Concat(object arg0, object arg1);
public static string Concat(string str0, string str1);
public static string Concat(object arg0, object arg1, object arg2);
public static string Concat(string str0, string str1, string str2);
public static string Concat(object arg0, object arg1, object arg2, object arg3);
public static string Concat(string str0, string str1, string str2, string str3);
public static Int32Add(params Int32[] values)
{
Int32 sum = 0;
for (Int32 x = 0; x < values.Length; x++)
{
sum += values[x];
}
return sum;
}
只有方法的最后一个参数才可以标记params,该参数必须标识一个一维数组,但类型不限。对方法的最后一个参数传递null或者0个数目的数组的引用都是合法的,如下面代码调用上面Add方法,编译正常,运行正常,和期望一样结果为0:
public static void Main()
{
Console.WriteLine(Add());
}
下面看一下如何编写一个可以接受任意数量、任意类型的参数的方法,也就是把上面方法的Int32改成Object[]就可以了:
public static void Main()
{
DisplayTypes(new Object(), new Random(), "string", 10);
}
public static void DisplayTypes(params Object[] objects)
{
foreach(Object o in objects)
{
Console.WriteLine(o.GetType());
}
}
输出:
System.Object
System.Random
System.String
System.Int32
注意,对于可接受可变数量参数的方法的调用会对性能造成一定的损失,因为数组是在堆上分配的,数组的元素还得初始化,数组的内存还得被垃圾回收器回收,为了减少这种没必要的性能损失,我们希望定义几个没有params关键字的重载方法,如System.String类的Concat方法,如下:
public static string Concat(object arg0);
public static string Concat(params object[] args);
public static string Concat(params string[] values);
public static string Concat(object arg0, object arg1);
public static string Concat(string str0, string str1);
public static string Concat(object arg0, object arg1, object arg2);
public static string Concat(string str0, string str1, string str2);
public static string Concat(object arg0, object arg1, object arg2, object arg3);
public static string Concat(string str0, string str1, string str2, string str3);
展开全部
params是用来传多个参数的关键字,就是说参数不确定(不止一个),使用params可以允许多个参数的传入。
就是官方解释的这样,
注意看例子:
让你用只有一个形参的方法
public static void UseParams(params int[] list)
传多个参数
UseParams(1, 2, 3);
看你代码的cmd.ExecuteScalar(),是不是这样。
你所有的提问,按照你的想法全部手敲一遍,就知道了
就是官方解释的这样,
注意看例子:
让你用只有一个形参的方法
public static void UseParams(params int[] list)
传多个参数
UseParams(1, 2, 3);
看你代码的cmd.ExecuteScalar(),是不是这样。
你所有的提问,按照你的想法全部手敲一遍,就知道了
本回答被网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
2012-07-13
展开全部
第一段是用来查询数据库的数据,第二段用来执行事务。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
和我用的貌似是一个样子的。。这个还真没有注意过。。。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询