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[]数组的个数本来就不知道,可以在外部根据实际情况指定的啊)?
展开
 我来答
autoaotu
2012-07-13 · TA获得超过1400个赞
知道小有建树答主
回答量:499
采纳率:0%
帮助的人:229万
展开全部
为了将方法声明为可以接受可变数量参数的方法,我们可以使用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);
yujunwu2525
推荐于2017-06-09 · TA获得超过3017个赞
知道小有建树答主
回答量:1389
采纳率:0%
帮助的人:967万
展开全部
params是用来传多个参数的关键字,就是说参数不确定(不止一个),使用params可以允许多个参数的传入。
就是官方解释的这样,
注意看例子:

让你用只有一个形参的方法
public static void UseParams(params int[] list)
传多个参数
UseParams(1, 2, 3);
看你代码的cmd.ExecuteScalar(),是不是这样。

你所有的提问,按照你的想法全部手敲一遍,就知道了
本回答被网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
匿名用户
2012-07-13
展开全部
第一段是用来查询数据库的数据,第二段用来执行事务。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
wym3587
2012-07-13 · TA获得超过385个赞
知道小有建树答主
回答量:499
采纳率:50%
帮助的人:112万
展开全部
和我用的貌似是一个样子的。。这个还真没有注意过。。。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 1条折叠回答
收起 更多回答(2)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式