参数是否可以用来通过函数的ref传递变量,使用yield
如果我有一个具有params参数的方法,可以通过参考传递并每次调用收益率时进行更新. 类似的东西: public static void GetRowsIter(ref params valuesToUpdate) { foreach(row in rows) { foreach(param in valuesToUpdate { GetValueForParam(param) } yield; } } 合法吗? (我远离编译器,否则我会尝试一下.) 解决方案 否. params只是创建一个包含正在传递的参数的数组.与所有其他数组一样,该数组只是变量的集合,并且无法声明ref变量或数组类型.因此,只能以ref或out的方式传递实际的显式参数. 说,如果类型是参考类型,则它将像往常一样展示参考类型语义,这意味着对对象进行的任何更改都将反映在所有可以访问该的代码
12 2024-04-20
编程技术问答社区
书呆子晚餐教程中C#收益率关键字的有趣使用
通过教程(专业ASP.NET MVC-书呆子晚餐)工作,我遇到了这个代码片段: public IEnumerable GetRuleViolations() { if (String.IsNullOrEmpty(Title)) yield return new RuleViolation("Title required", "Title"); if (String.IsNullOrEmpty(Description)) yield return new RuleViolation("Description required","Description"); if (String.IsNullOrEmpty(HostedBy)) yield return new RuleViolation("HostedBy required", "HostedBy"); if (Strin
24 2024-04-18
编程技术问答社区
误用C#迭代器来实现Coroutines的陷阱
我正在编写重构Silverlight程序,以消耗WCF服务中现有业务逻辑的一部分.在此过程中,我遇到了Silverlight 3中的限制,该限制只允许对WCF服务的异步调用,以避免在长期运行或非响应的服务呼叫的情况下阻止UI线程(SL具有一个有趣的排队模型,用于调用WCF服务在UI线程上). 因此,写了曾经很简单的东西,变得越来越复杂(请参阅我的问题结束时的代码示例).). 理想情况下,我会使用 coroutines 简化了实现,但是可悲的是,C#没有C#目前支持Coroutines作为母语设施.但是,C#确实使用yield return语法具有生成器(迭代器)的概念.我的想法是重新使用产量关键字,以使我可以为同一逻辑构建一个简单的Coroutine模型. 我不愿意这样做,因为我担心可能会有一些我不期望的隐藏(技术)陷阱(考虑到我对Silverlight和WCF的相对经验不足).我还担心未来的开发人员可能无法清楚实施机制,并且可能会阻碍他们将来维护或扩展该代码的努力.我
12 2024-04-18
编程技术问答社区
错误 '迭代器不能包含返回语句 '当调用一个使用收益率返回的方法时。
我希望有一种更好的方法来编写此方法并以更少的代码重复.我想在列表中的项目之间返回一系列deltas.此方法: - public static IEnumerable CalculateDeltas(this IEnumerable sequence) { decimal prev = default(decimal); foreach (var item in sequence) { var current = item; decimal diff = current - prev; prev = item; yield return diff; } } 工作正常. 然后,我考虑了一个允许绝对三角洲的过载,但是如果不需要绝对,则会调用原始方法: -
16 2024-04-18
编程技术问答社区
收益率返回比返回列表的并发性或性能优势
我想知道是否存在任何并发(现在或将来),或者使用返回列表的收益率收益的绩效好处.请参阅以下示例 处理方法 void Page_Load() { foreach(var item in GetPostedItems()) Process(item); } 使用收益率返回 IEnumerable GetPostedItems() { yield return Item1.Text; yield return Item2.Text; yield return Item3.Text; } 返回列表 IEnumerable GetPostedItems() { var list = new List(); list.Add(Item1.Text); list.Add(Item2.Text); list.Add(Item3.Text); return list; } 解决
20 2024-04-18
编程技术问答社区
什么是产量,在asp .NET中使用产量有什么好处?
您可以帮助我理解yield asp .NET(C#)> 中的关键字 解决方案 收益率自动为您创建枚举器. 9K7K7CF0.aspx 因此您可以做 之类的事情 //pseudo code: while(get_next_record_from_database) { yield return your_next_record; } 它允许您快速创建一个可以循环并检索记录的对象集合(枚举器).收益率返回语句处理为您创建枚举所需的所有代码. 收益率返回语句的重要部分是,您不必在将集合返回到调用方法之前加载集合中的所有项目.它允许懒惰的加载 ,因此您不会一次支付访问罚款. 何时使用收益率返回. . 其他解决方案 产量不仅仅是语法糖或创建iEnumerables的简便方法. 有关更多信息,我会查看Justin Etherage的博客有一篇很棒的文章,解释了收益率的更高级用法. 其他解决方案 yield用作句法糖来从方法中返回IEnu
20 2024-04-17
编程技术问答社区
Yield Return == IEnumerable & IEnumerator?
是yield return用于实现IEnumerable和IEnumerator的快捷方式? 解决方案 是的,是. 您可以在我的书《深度C#》第6章中找到更多有关它的信息.幸运的是,第6章是免费提供 //manning.com/skeet/" rel =" noreferrer">曼宁的网站. 我也有两个其他 com/comm/converth11/streamanditerators.aspx" rel =" noreferrer">文章在书的网站上. 欢迎反馈. 其他解决方案 要添加到链接节上,雷蒙德·陈(Raymond Chen)几个月前在C#迭代器上做了一个不错的小系列: /archive/2008/08/14/8862242.aspx 其他解决方案 是.请参阅以下内容的入门
28 2024-04-17
编程技术问答社区
C# IEnumerator/yield结构可能是坏的?
背景:我从数据库中获得了很多字符串,我想返回它们.传统上,这将是这样的: public List GetStuff(string connectionString) { List categoryList = new List(); using (SqlConnection sqlConnection = new SqlConnection(connectionString)) { string commandText = "GetStuff"; using (SqlCommand sqlCommand = new SqlCommand(commandText, sqlConnection)) { sqlCommand.CommandType = CommandType.StoredProcedure; sqlCo
16 2024-04-17
编程技术问答社区
为什么一个IEnumerator至少要有一个yield语句,即使它是不可达的?
为什么此代码: public IEnumerator Test() { } 给您一个错误: 错误CS0161'test.getEnumerator()':并非所有代码路径返回值 但是,此代码: public IEnumerator Test() { if(false) yield return 0; } 不? (并按预期工作;第一个movenext()返回false) 在使用ienumerators用作Coroutines时,有时您想制作一个尚未有异步操作的Coroutine(Ienumerator)(尚未产生任何东西),但将来可能会做到这一点. 解决方案 来自C#规格: 一个包含一个或多个收益率语句(§8.14)的块被调用 迭代器块.迭代器块用于实现功能 成员作为迭代器(§10.14). 因此,如果您有一个或多个收益率语句,无论是否可以到达,您的方法都是迭代器(在引擎盖下会生成迭代器类).但是,如果您没有
18 2024-04-16
编程技术问答社区
C#: 如何翻译Yield关键字
如果没有收益率关键字,MSDN样本会是什么样?如果您透露,则可以使用任何示例.我只想了解引擎盖下发生了什么. 收益率运算符热切 lazily 评估? 样本: using System; using System.Collections; public class List { public static IEnumerable Power(int number, int exponent) { int counter = 0; int result = 1; while (counter++
16 2024-04-16
编程技术问答社区
C#中的纤维素:它们是否比迭代器更快,人们是否使用过它们?
所以我正在和一位同事聊天 fibers "> fibers =" http://msdn.microsoft.com/en-gb/magazine/cc164086.aspx" rel =" noreferrer"> 2003年的本文 描述了使用光纤API的C#中的Coroutines实现./p> 本文中Yield的实现是.NET 1.1,因此它早于.NET 2.0中出现的yield return语法. 乍一看,这里的实现可能更快,并且可以很好地扩展多个CPU. 有人使用过吗? 解决方案 我没有使用过它,但是我对这个主题有兴趣.这是C#中的Coroutines的一个不错的实现,其中包括圆形调度程序:顺便说一句,引用 wikipedia 作为Coroutines".据我所知,与C#中的Coroutine(或光纤)最接近的是迭代器.实际上,它们非常接近Coroutines. lippert 发布了几个有关迭代器的捕获.希望他们都不代表您需要的目的. 其他解决方案
18 2024-04-15
编程技术问答社区
序列化和Yield语句
是否可以序列化包含yield语句的方法(或包含这种方法的类),使得当您补充类时,保留了生成的迭代器的内部状态? 解决方案 是的,您可以做到这一点.有警告. 可以在此处找到用yield序列化方法的示例,可以在这里找到: http://www.agilekiwi.com/dotnet/countingdemo.cs ( web存档链接). 通常,试图在不做额外工作的情况下进行序列化将失败.这是编译器生成的类未用Serializable属性标记的.但是,您可以解决这个问题. 我会注意到它们没有序列化标记的原因是因为它们是实现细节,并且会受到未来版本的破坏变化,因此您可能无法在较新版本中对其进行估算. 与我在中提出的问题有关也为这种情况工作. 这是" hack"的源代码: // Copyright © 2007 John M Rusk (http://www.agilekiwi.com) // // You may use this source c
18 2024-04-14
编程技术问答社区
缓存IEnumerable
public IEnumerable ListModules() { foreach (XElement m in Source.Descendants("Module")) { yield return new ModuleData(m.Element("ModuleID").Value); } } 最初,上述代码很棒,因为如果不需要整个集合,则无需评估整个集合. 但是,一旦所有模块都被列举了一次,在没有更改时反复查询Xdocument会变得更加昂贵. 因此,作为绩效的改进: public IEnumerable ListModules() { if (Modules == null) { Modules = new List(); foreach (XElement m in Source.Descend
6 2024-04-14
编程技术问答社区
产量在LINQ之外是否有用?
每当我认为我可以使用收益率关键字时,我就会退后一步,看看它将如何影响我的项目.我总是最终返回一个收藏而不是Yeilding,因为我觉得维持Yeilding方法状态的开销并不能为我买太多.在几乎所有的情况下,我都返回收藏集,我觉得90%的时间将在集合中的所有元素上迭代,或者将在整个集合中寻求一系列元素. 我确实理解了它在LINQ中的有用性,但是我觉得只有Linq团队正在编写如此复杂的可查询对象,以使收益很有用. 有人写了像Linq一样有用的linq之类的东西吗? 解决方案 我最近必须以表达式类别的形式代表数学表达式.在评估表达式时,我必须用后阶树漫步穿越树结构.为了实现这一目标,我实现了这样的Ienumerable : public IEnumerator> GetEnumerator() { if (IsLeaf) { yield return this; } else {
14 2024-04-14
编程技术问答社区
在C#中屈服返回是线程安全的吗?
我有以下代码: private Dictionary items = new Dictionary; public IEnumerable Keys { get { foreach (object key in items.Keys) { yield return key; } } } 这个线程安全吗?如果没有,我必须在循环或yield return>? 周围放置一个lock 这是我的意思: thread1访问Keys属性,而thread2将项目添加到基础字典中. thread1是否受Thread2的添加? 的影响 解决方案 好吧,我进行了一些测试并得到了一个有趣的结果. 看来,这比yield关键字更多的是枚举基础集合的问题.枚举器(实际上是其MoveNext方法)抛出(如果正确实现
24 2024-04-14
编程技术问答社区
为什么要使用yield关键字,而我可以直接使用普通的IEnumerable?
给定此代码: IEnumerable FilteredList() { foreach( object item in FullList ) { if( IsItemInPartialList( item ) ) yield return item; } } 为什么我不仅要这样编码?: IEnumerable FilteredList() { var list = new List(); foreach( object item in FullList ) { if( IsItemInPartialList( item ) ) list.Add(item); } return list; } 我了解yield关键字的作用.它告诉编译器构建某种东西(迭代器).但是为什么要使用呢?
20 2024-04-14
编程技术问答社区
产量如何实现懒惰加载的模式?
yield如何实现lazy loading的模式? 解决方案 收益率实施在需要之前才能达到代码. 例如,此代码: public IEnumerable GetInts() { yield return 1; yield return 2; yield return 3; } 实际上将编译成实现IEnumerable的嵌套类,GetInts()的主体将返回该类的实例. 使用反射器您可以看到: public IEnumerable GetInts() { d__6d d__d = new d__6d(-2); d__d.4__this = this; return d__d; } 编辑 - 添加有关GetInts实现的更多信息: 这种实现使其懒惰的方式基于Enumerator MoveNext() 方法.当生成枚举的嵌套类(示例中的
26 2024-04-13
编程技术问答社区
产量在现实生活中的应用是什么?
我知道yield有什么,我已经看过几个例子,但是我想不出现实生活中的应用,您是否使用它来解决一些特定的问题? (理想情况下,某些无法解决的问题) 解决方案 我意识到这是一个古老的问题(前乔恩·斯基特(Jon Skeet)?),但是我最近一直在考虑这个问题.不幸的是,这里的当前答案(我认为)没有提及收益率陈述的最明显优势. 收益率声明的最大好处是,它允许您迭代具有更有效的内存使用情况的非常大的列表,然后使用标准列表. 例如,假设您有一个返回100万行的数据库查询.您可以使用DataReader检索所有行并将它们存储在列表中,因此需要list_size * row_size字节的内存. ,或者您可以使用收益率语句创建迭代器,并且一次只能存储一行.实际上,这使您能够在大量数据上提供"流"功能. 此外,在使用迭代器的代码中,您使用一个简单的foreach循环,可以决定根据需要从循环中脱颖而出.如果您确实提早断裂,则只有需要前5行(例如). 关于:
10 2024-04-13
编程技术问答社区
谁能解释一下收益率这个关键词?
我已经看到堆栈溢出和博客上使用了很多收益关键字.我不使用 linq .有人可以解释收益率关键字吗? 我知道存在类似的问题. 但是没有人真正解释它在简单的语言中的用途. 解决方案 到目前为止,对此的最佳解释(我已经看到)是乔恩·斯基特(Jon Skeet)的书 - 那章是免费的!第6章, c#in Depth .我在这里没有什么可以添加的. 然后买书;您将成为更好的C#程序员. 问:为什么我不在这里写一个更长的答案(从评论中解释);简单的.正如Eric Lippert所观察到的(在这里),yield构造(以及后面的魔法)是 C#编译器中最复杂的代码中的单一代码,并尝试描述在这里的简短回复中,它充其量是天真的. yield有很多细微差别,以至于IMO最好参考先前存在的(且完全合格的)资源. Eric的博客现在有7个条目(这只是最近的条目)讨论yield.我对埃里克有一个 的尊重,但他的博客可能更合适,因为 对这个主题感到满意的人(yield in这种情况),因
16 2024-04-13
编程技术问答社区
C#: 产量返回范围/集合
我使用yield return关键字很多,但是当我想向IEnumerable添加范围时,我发现它缺乏.这是我想做的快速示例: IEnumerable SomeRecursiveMethod() { // some code // ... yield return SomeRecursiveMethod(); } 自然会导致错误,可以通过简单的循环来解决.有一个更好的方法吗?循环有点笨拙. 解决方案 不,恐怕没有. f# dis 用yield!支持这一点,但是C#中没有等效的 - 您基本上必须使用循环.抱歉...我感到你的痛苦.我在我的Edulinq博客之一,它会使事情变得更简单. 请注意,递归使用收益率可能很昂贵 - 请参阅 Wes Dyer在迭代器上的帖子有关更多信息(并提到四年前正在考虑的"收益率" ...) ) 其他解决方案 如果您已经有一个IEnumerable循环循环,并且返回类型为IEnumerabl
20 2024-04-13
编程技术问答社区