C# out参数 传值是在函数退出还是在函数执行时?

Anod 2012-06-21 02:21:54
个人觉得是在函数退出时,要不然中间传出后若是后面推出前再次赋值岂不使得引用中间传出值的线程或者其他活动出错?
求传道授业解惑!
...全文
207 18 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
Anod 2012-06-25
  • 打赏
  • 举报
回复
在这里讨论线程的执行绪没什么意思,只要知道OUT的那个值在函数执行期可以变就对了,
风吹腚腚凉 2012-06-21
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 的回复:]
引用传值一定会变的,但多线程是无序执行的
[/Quote]
多线程的执行跟CPU有关系,不能一概而论
不慕繁华 2012-06-21
  • 打赏
  • 举报
回复
引用传值一定会变的,但多线程是无序执行的
不慕繁华 2012-06-21
  • 打赏
  • 举报
回复
class Program
{

static void Main(string[] args)
{
Test test = new Test();
test.Show();
}

}
class Test
{
int speed;
public void Show()
{
speed = 2;
Thread first = new Thread(new ThreadStart(Walk));
Thread second = new Thread(new ThreadStart(Eat));
first.Start();
second.Start();
Console.WriteLine(speed);
Console.ReadKey();
}
private void Eat()
{
speed = 1;
}
private void Walk()
{
Run(out speed);
}
private void Run(out int var)
{
var = 3;
}
}
qldsrx 2012-06-21
  • 打赏
  • 举报
回复
肯定会变的,不然怎么获取值啊,又不是返回值。其实它和ref都是地址传递的意思,只不过C#为了可以更加明确传递的地址是否为空地址,才区分出了一个out关键字。
Anod 2012-06-21
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 的回复:]
我估错了,会变的

C# code
static int a = 1;

static void Main(string[] argv)
{
ThreadPool.QueueUserWorkItem(p =>
{
while (true)
{
Console.WriteLine(a);
……
[/Quote]

俺菜鸟一个,不懂线程池用法 嘿嘿 得看下
Anod 2012-06-21
  • 打赏
  • 举报
回复
          class Program
{
static void Main(string[] args)
{
Thread a = new Thread(ThreadAFuncion);
a.Start();
ThreadTest(out testnum);
}

static int testnum = 10000;
static void ThreadAFuncion()
{
Console.WriteLine("Start");
while (testnum > 0)
{
Console.WriteLine("Thread:"+ testnum.ToString());
}
}
static void ThreadTest(out int aaa)
{
aaa = 10000;
while (true)
{
aaa--;
Thread.Sleep(100);
}

}

会变哈哈,确实如此
Anod 2012-06-21
  • 打赏
  • 举报
回复
          class Program
{
static void Main(string[] args)
{
Thread a = new Thread(ThreadAFuncion);
a.Start();
ThreadTest(out testnum);
}

static int testnum = 10000;
static void ThreadAFuncion()
{
Console.WriteLine("Start");
while (testnum > 0)
{
Console.WriteLine("Thread:"+ testnum.ToString());
}
}
static void ThreadTest(out int aaa)
{
aaa = 10000;
while (true)
{
aaa--;
Thread.Sleep(100);
}

}

会变哈哈,确实如此
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 的回复:]
out参数,穿进去后,会重新初始化,之前初始化没用,所以out参数可以不用提前初始化,ref需要提前初始化
[/Quote]
__天涯寻梦 2012-06-21
  • 打赏
  • 举报
回复
我估错了,会变的
static int a = 1;

static void Main(string[] argv)
{
ThreadPool.QueueUserWorkItem(p =>
{
while (true)
{
Console.WriteLine(a);
Thread.Sleep(500);
}
});

Proc(out a);
}

private static void Proc(out int a)
{
var ram = new Random();
while (true)
{
Thread.Sleep(200);
a = ram.Next(1000);
}
}
Anod 2012-06-21
  • 打赏
  • 举报
回复
求举例 俺手打程序太慢了 求给个两线程的小程序跑下
风吹腚腚凉 2012-06-21
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 的回复:]
不会。。
[/Quote]
为什么不会请举例
__天涯寻梦 2012-06-21
  • 打赏
  • 举报
回复
不会。。
Anod 2012-06-21
  • 打赏
  • 举报
回复
都没看懂我的意思,

我的意思是out参数,传进去后,在函数内被初始化并重新赋新的值然后重复这样的操作,函数不退出,在函数外的其他线程引用该参数,该参数的值会不会一直在变?
风吹腚腚凉 2012-06-21
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 的回复:]
out参数,穿进去后,会重新初始化,之前初始化没用,所以out参数可以不用提前初始化,ref需要提前初始化
[/Quote]
了解了
bdmh 2012-06-21
  • 打赏
  • 举报
回复
out参数,穿进去后,会重新初始化,之前初始化没用,所以out参数可以不用提前初始化,ref需要提前初始化
__天涯寻梦 2012-06-21
  • 打赏
  • 举报
回复
在调用函数前内存就分配好,将内存地址传入函数,函数运行过程中,代码执行到要赋值时就修改,无所谓是不是退出时
SocketUp 2012-06-21
  • 打赏
  • 举报
回复
赋值时修改

111,092

社区成员

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

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

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