out 返回 和直接返回类型,有什么区别,哪个性能更好.

hbjmdx008 2007-12-11 09:04:48
比如
public DataTable RunSql(string sqlStr )
{
SqlCommand cmd = CreateCommand(sqlStr, null, 1);
DataTable dt = new DataTable();

SqlDataAdapter sda = new SqlDataAdapter();
sda.SelectCommand = cmd;
conn.Open();
sda.Fill(dt);

conn.Close();
return dt;
}



public void RunSql(string sqlStr, out DataTable dt)
{
SqlCommand cmd = CreateCommand(sqlStr, null, 1);
DataTable dt1 = new DataTable();

SqlDataAdapter sda = new SqlDataAdapter();
sda.SelectCommand = cmd;
conn.Open();
sda.Fill(dt1);
dt = dt1;
conn.Close();

}
两者性能差异如何呢?
...全文
135 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
hbjmdx008 2007-12-11
  • 打赏
  • 举报
回复
非常感谢.
kkun_3yue3 2007-12-11
  • 打赏
  • 举报
回复
楼上的真强!
vwxyzh 2007-12-11
  • 打赏
  • 举报
回复
性能测试代码:
        static void Main(string[] args)
{
Stopwatch sw = new Stopwatch();
Console.WriteLine("-----------value type test-----------");
int j;
sw.Start();
for (int i = 0; i < 10000000; i++)
;
sw.Stop();
Console.WriteLine("loop:{0}", sw.ElapsedMilliseconds);
sw.Reset();
sw.Start();
for (int i = 0; i < 10000000; i++)
j = Increase(i);
sw.Stop();
Console.WriteLine("return:{0}", sw.ElapsedMilliseconds);
sw.Reset();
sw.Start();
for (int i = 0; i < 10000000; i++)
Increase(i, out j);
sw.Stop();
Console.WriteLine("out:{0}", sw.ElapsedMilliseconds);
sw.Reset();

Console.WriteLine("-----------reference type test-----------");
object result;
sw.Start();
for (int i = 0; i < 10000000; i++)
;
sw.Stop();
Console.WriteLine("loop:{0}", sw.ElapsedMilliseconds);
sw.Reset();
sw.Start();
for (int i = 0; i < 10000000; i++)
result = NewObject();
sw.Stop();
Console.WriteLine("return:{0}", sw.ElapsedMilliseconds);
sw.Reset();
sw.Start();
for (int i = 0; i < 10000000; i++)
NewObject(out result);
sw.Stop();
Console.WriteLine("out:{0}", sw.ElapsedMilliseconds);

Console.ReadLine();
}

private static void Increase(int i, out int j)
{
j = i + 1;
}

private static int Increase(int i)
{
return i + 1;
}

private static object NewObject()
{
return new object();
}

private static void NewObject(out object result)
{
result = new object();
}

Debug运行结果:
-----------value type test-----------
loop:46
return:125
out:110
-----------reference type test-----------
loop:28
return:264
out:272
Release运行结果:
-----------value type test-----------
loop:5
return:11
out:10
-----------reference type test-----------
loop:5
return:94
out:94

值类型的out性能略好,引用类型的性能相似
不过还是倾向于用返回值,主要还是代码可读性的问题
honey52570 2007-12-11
  • 打赏
  • 举报
回复
ref也是传址
hbjmdx008 2007-12-11
  • 打赏
  • 举报
回复
是不是可以这样理解,out 是地址传递, 非out 的那种是值传递?
liuyun1987 2007-12-11
  • 打赏
  • 举报
回复
out的函数会清空变量,即使变量已经赋值也不行,退出函数时所有out引用的变量都要赋值
csharp_start 2007-12-11
  • 打赏
  • 举报
回复
答非所问!
honey52570 2007-12-11
  • 打赏
  • 举报
回复
性能没有可比性么? out还不需要副本呢....


看具体应用,难道你传参数都要修改原值么?
stning 2007-12-11
  • 打赏
  • 举报
回复
学习中。up
vwxyzh 2007-12-11
  • 打赏
  • 举报
回复
直接返回的性能更好,通常out用于返回更多的返回值,例如:RunSql本身返回一个bool表达是否正确执行了,再返回一个结果DataTable
EricGuzuqiang 2007-12-11
  • 打赏
  • 举报
回复
顶 性能呢?
honey52570 2007-12-11
  • 打赏
  • 举报
回复
void change(out string a)
dobear_0922 2007-12-11
  • 打赏
  • 举报
回复
1楼正解,,,
honey52570 2007-12-11
  • 打赏
  • 举报
回复
out 的参数可以未初始化

比如:
string a;

void change(out a)
{
//...
}

调用:
change(a);
honey52570 2007-12-11
  • 打赏
  • 举报
回复
out 传的是原址 在函数调用后,会改变原值

普通的传的副本,这个不会

110,536

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧