Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/294.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 为什么begin方法会去掉参数?_C#_.net_Asynchronous - Fatal编程技术网

C# 为什么begin方法会去掉参数?

C# 为什么begin方法会去掉参数?,c#,.net,asynchronous,C#,.net,Asynchronous,我是异步编程新手,我在读一本书,书中展示了下面的一些示例API: // synchronous version SearchResults GetResults(int page, int pageSize, out int itemsReturned); // asynchronous version IAsyncResult BeginGetResults(int page, int pageSize,

我是异步编程新手,我在读一本书,书中展示了下面的一些示例API:

// synchronous version
SearchResults GetResults(int page, int pageSize, out int itemsReturned);  

// asynchronous version
IAsyncResult BeginGetResults(int page,
                             int pageSize,
                             out int itemsReturned,
                             AsyncCallback callback,
                             object state);
SearchResults EndGetResults(out int itemsReturned, IAsyncResult iar);
请注意,Begin方法将“out”参数作为
out int itemsReturned

以下是作者的解释:

事实证明这是一个抽象概念。CLR没有out参数的概念;这是一个C#语言习语。在CLR级别,out参数只是ref参数,而C#编译器才是它的核心 强制执行特定的使用模式。因为异步编程模型不是特定于语言的特性,所以它必须符合CLR的需要。现在ref参数可以是输入和输出;因此,CLR不知道这些out参数仅用于输出,因此必须将它们放在Begin方法和End方法上。

我还是很困惑,下面是我的问题:

Q1-我们知道在方法返回之前,
out
参数需要分配一个值,因此在这种情况下,在Begin方法完成后,
itemsReturned
是否设置为0?设定某事物的意义是什么?你知道在现阶段它是不正确的

Q2在Begin方法中去掉
out int itemsreturn
不是更简单吗

IAsyncResult BeginGetResults(int page,
                             int pageSize,                            
                             AsyncCallback callback,
                             object state);

我们仍然可以在End方法中使用
out int itemsReturned

Q1。我同意;这似乎是一个可怕的设计想法,作者,并不是典型的任何方式;我怀疑作者没有很好地掌握公认的混乱模式,只是简单地插入了一些东西;也许他们已经在非异步方法上使用了
out
API,并且希望它保持一致

问题2。是的,但我会更进一步,将返回的项目作为附加的属性放在
搜索结果
上,而不是作为
输出
参数放在
EndGetResults上

但重点是:这不是当前/首选的异步代码编写方式;如果你刚开始,不要走这条路;我只要:

SearchResults搜索(int-page,int-pageSize);
async ValueTask SearchAsync(int page,int pageSize);

并且让
public int items在
SearchResults
上返回{get;}
注意:如果您刚刚开始研究异步,坦率地说,我建议不要研究
IAsyncResult
——这是一种古老的、过时的异步模式;现在比较流行的习惯用法是
async
,也就是
[Value]Task[]
@marcGravel是的,我只需要先学习basic,就可以拥有构建块。很快就要学习任务了不,这不是“基础优先”的问题;
IAsyncResult
没有什么“基本的”—它极其复杂和微妙,坦率地说,这两种方法之间几乎没有交叉点;学习
IAsyncResult
不会帮助您了解
任务
;如果有什么区别的话,它只会给一个已经令人困惑的话题增添困惑;在我看来:除非你绝对需要(因为你使用的是一个无法更新的古老系统),否则根本不要查看
IAsyncResult
来增加它;旧的
IAsyncResult
非常复杂,因为支持基于任务的异步的语言和运行时特性不存在;现代异步的全部要点是使这个主题变得容易理解;再次重申:
IAsyncResult
不是现代异步的“积木”,就像学习如何骑马、驯马和喂马不是驾驶汽车的积木一样;在汽车出现之前,这些都是常客必备的技能