我知道yield的作用,我也看过几个例子,但我想不出现实生活中的应用,你有没有用它来解决一些具体问题?(理想情况下是一些无法通过其他方式解决的问题) 最佳答案 我意识到这是一个老问题(在JonSkeet之前?)但我最近一直在考虑这个问题。不幸的是,这里当前的答案(在我看来)没有提到yield语句最明显的优势。yield语句的最大好处是它允许您以比使用标准列表更高效的内存使用率迭代非常大的列表。例如,假设您有一个返回100万行的数据库查询。您可以使用DataReader检索所有行并将它们存储在列表中,因此需要list_size*row
在完成教程(专业ASP.NETMVC-Nerd晚餐)时,我遇到了这段代码:publicIEnumerableGetRuleViolations(){if(String.IsNullOrEmpty(Title))yieldreturnnewRuleViolation("Titlerequired","Title");if(String.IsNullOrEmpty(Description))yieldreturnnewRuleViolation("Descriptionrequired","Description");if(String.IsNullOrEmpty(HostedBy))yi
该方法通过yieldreturn语句返回IEnumerable。如果yield语句从未发生(它在条件逻辑中),该方法会返回null,还是会返回一个计数为0的Enumerable? 最佳答案 一个有效的IEnumerable,当您遍历它时不产生任何值。试想一下:您可以将IEnumerable生成器存储在一个变量中-代码本身只会在您实际遍历结果时执行。如果您有null,您如何执行代码?或者您如何知道该函数在不运行的情况下不会产生任何结果。 关于c#-如果yieldreturn从未发生,是否返
我得到了这个方法(在UnityC#脚本中),但我不明白“yield”部分的实际工作原理。我从MSDN了解到该函数将返回一个我可以迭代的IEnumerator,但是这段代码等待1.5秒并且不会被迭代,因为这意味着在内部创建的对象被创建了多次。这里有人可以向我解释这段代码是如何工作的吗?IEnumeratorDestroyShip(){//createnewgameobjectInstantiate(ExplosionPrefab,transform.position,transform.rotation);//makecurrentgameobjectinvisiblegameObjec
Delay(0)是否总是内联?根据我的经验,它确实:usingSystem;usingSystem.Threading;usingSystem.Threading.Tasks;namespaceConsoleApplication{classProgram{staticasyncTaskTest(){awaitTask.Yield();Console.WriteLine("afterYield(),thread:{0}",Thread.CurrentThread.ManagedThreadId);awaitTask.Delay(0);Console.WriteLine("afterDe
我有一个像这样的长循环程序:publicvoidProcess(){booldone=false;do{//dostuff}while(!done);}我想分成几部分,让调用例程在某种UI中显示我的进度。它是一个类库,因此调用者可以是任何东西(控制台应用程序、WinForms、WebApp等)。如果我能做到,那将是最简单的:publicvoidProcess(){booldone=false;do{//dostuffyieldreturn;}while(!done);}因此调用者可以继续调用该方法直到它完成。这听起来更像是BackgroundWorker的工作,但对于控制台应用程序来说
是否可以序列化包含yield语句的方法(或包含此类方法的类),以便在重新水化该类时,保留生成的迭代器的内部状态? 最佳答案 是的,你可以做到这一点。注意事项。可以在此处找到使用yield序列化方法、反序列化和继续的示例:http://www.agilekiwi.com/dotnet/CountingDemo.cs(WebArchiveLink)。一般来说,尝试序列化而不做一些额外的工作会失败。这是因为编译器生成的类没有用Serializable属性标记。但是,您可以解决这个问题。我会注意到它们没有标记为可序列化的原因是因为它们是一个
这是我用来从数据库中获取数据的示例代码:在DAO层上:publicIEnumerableGetDATA(ICommonSearchCriteriaDtocommonSearchCriteriaDto){using(DbContext){DbDataReaderreader=DbContext.GetReader("ABC_PACKAGE.GET_DATA",oracleParams.ToArray(),CommandType.StoredProcedure);while(reader.Read()){yieldreturnreader;}}}在BO层我调用上面的方法如下:ListGri
这个问题在这里已经有了答案:关闭11年前。PossibleDuplicate:Defaultvalueforgenerics好的,所以在将一些代码从C#转换为VB.NET时,我遇到了default关键字,我只是将其替换为nothing。这是正确的方法吗,或者是否有更好的关键字“翻译”?
如果我没记错的话,当我在usingSqlConnectionblock中使用yield时,我遇到了运行时异常。using(varconnection=newSqlConnection(connectionString)){varcommand=newSqlCommand(queryString,connection);connection.Open();SqlDataReaderreader=command.ExecuteReader();//CallReadbeforeaccessingdata.while(reader.Read()){yieldreader[0];}//CallC