gpt4 book ai didi

c# - C# 中的语句之间是否存在延迟?

转载 作者:行者123 更新时间:2023-12-03 15:05:30 26 4
gpt4 key购买 nike

我不确定如何解释我要问的问题,因此请考虑以下示例:

int number;

void ChangeNumber()
{
number++;
UseNumber(number);
}

void UseNumber(int value)
{
// use number
}

我正在使用这个简单的示例来尝试确定脚本在运行时是否等待一项任务完成,然后再进行下一项任务。例如, UseNumber(number) 是否仅在数字之前增加后才被调用?

考虑代替 number++ 我正在调用另一个方法,该方法进行了一些复杂的计算并且还自己调用了其他方法,UseNumber(number) 是否仍会在调用之前等待所有这些运行?如果不是,在这种情况下,回调是否是一个不错的选择,以确保先完成先前的任务?

最佳答案

简短的回答是:C# 的行为是明智的;你可以保证前面语句的效果会被后面的语句观察到。

长长的答案是:当你看到更复杂的情况时,事情会更微妙。

首先:C# 不保证代码实际运行的顺序与它在程序中出现的顺序相同。所做出的保证比这更微妙:语言保证程序看起来就像是按照代码在程序中出现的顺序运行一样。

这种微妙之处可能需要更多的解释。假设你有:

int foo = 1;
int bar = 2;
foo += 1;
bar += 1;
Console.WriteLine(foo);
Console.WriteLine(bar);

该程序必须在控制台写入之前增加 foo 和 bar,并且控制台写入必须先发生 foo,然后是 bar。但是,上面程序片段的行为与:
int foo = 1;
int bar = 2;
bar += 1;
foo += 1;
Console.WriteLine(foo);
Console.WriteLine(bar);

这与此程序片段具有相同的行为:
Console.WriteLine(2);
Console.WriteLine(3);

由于在每种情况下观察到的副作用都是相同的,因此 C# 可以运行这些程序中的任何一个,而不是最初编写的代码。

当您添加时,事情会变得更加复杂:
  • 迭代器块
  • 异步工作流
  • 并发
  • 非托管代码互操作
  • 定稿

  • 当你把它们放进去时,关于 C# 如何保证保留效果顺序的限制变得非常复杂;描述其中任何一个都可能是一个非常长的答案,因此如果您有问题,请尝试提出第二个更集中的问题。

    关于c# - C# 中的语句之间是否存在延迟?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59756833/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com