假设我有 IEnumerable<string> Foo() { try { /// open a network connection, start reading packets while(moredata) { yield return packet; } } finally { // close connection } } (或者,也许我做了一个'使用' – 同样的事情)。 如果我的呼叫者去了会发生什么 var packet = Foo().First(); 我只是留下了泄漏的连接。 什么时候终于被调用? 或者正确的事情总是通过魔法发生 编辑答案和想法 我的示例和其他“正常”(foreach,..)调用模式将很好地工作,因为他们处置IEnumerable(实际上是GetEnumerator返回的IEnumerator)。 因此,我必须有一个调用者在做一些奇怪的事情(明确地获得一个枚举器,而不是处理它或类似的东西)。 我会让他们开枪 糟糕的代码 我find了一个来电者 IEnumerator<T> enumerator = foo().GetEnumerator(); 变成 using(IEnumerator<T> enumerator = foo().GetEnumerator())
我写了我自己的自定义数据层来坚持一个特定的文件,我用自定义的DataContext模式抽象它。 这是基于.NET 2.0框架(给定目标服务器的限制),所以即使其中一些看起来像LINQ到SQL,它不是! 我刚刚实现了一个类似的数据模式。 看下面的例子,我不能解释的情况的例子。 为了获得动物的所有实例 – 我这样做,它工作正常 public static IEnumerable<Animal> GetAllAnimals() { AnimalDataContext dataContext = new AnimalDataContext(); return dataContext.GetAllAnimals(); } 并在下面的AnimalDataContext()中实现GetAllAnimals()方法 public IEnumerable<Animal> GetAllAnimals() { foreach (var animalName in AnimalXmlReader.GetNames()) { yield return GetAnimal(animalName); } } AnimalDataContext()实现了IDisposable,因为我在那里有一个XmlTextReader,我想确保它快速清理。 现在,如果我把这样的使用语句中的第一个调用 public static IEnumerable<Animal> GetAllAnimals() { using(AnimalDataContext dataContext = new AnimalDataContext()) { return dataContext.GetAllAnimals(); } } 并在AnimalDataContext.GetAllAnimals()方法的第一行放置一个断点,并在AnimalDataContext.Dispose()方法的第一行放置另一个断点,然后执行… […]
我见过的所有使用yield return x;的例子都yield return x; 在一个C#方法内可以通过返回整个列表以相同的方式完成。 在这些情况下,使用yield return语句与返回列表是否有什么好处? 另外,在什么types的情况下会yield return ,你不能只返回完整的列表?
我认为这样做会很好(用lambda做一个yield return): public IList<T> Find<T>(Expression<Func<T, bool>> expression) where T : class, new() { IList<T> list = GetList<T>(); var fun = expression.Compile(); var items = () => { foreach (var item in list) if (fun.Invoke(item)) yield return item; // This is not allowed by C# } return items.ToList(); } 但是,我发现我不能以匿名方式使用收益率。 我想知道为什么。 产量文档只是说这是不允许的。 由于这是不允许的,我只是创build列表并添加项目。
我知道Java本身没有直接的等价物,但也许是第三方? 这真的很方便。 目前我想实现一个迭代器,它产生一个树中的所有节点,大约有五行代码和yield。
我有以下function来获取卡的validation错误。 我的问题涉及到处理GetErrors。 两种方法都有相同的返回typesIEnumerable<ErrorInfo> 。 private static IEnumerable<ErrorInfo> GetErrors(Card card) { var errors = GetMoreErrors(card); foreach (var e in errors) yield return e; // further yield returns for more validation errors } 是否有可能返回在GetMoreErrors所有错误,而不必通过他们枚举? 思考这可能是一个愚蠢的问题,但我想确保我不会出错。
这个问题在这里已经有了答案: 返回一个IEnumerable的时候有没有理由不使用“yield return”? 关于yield return的好处,这里有几个有用的问题。 例如, 有人可以揭开yield关键字的神秘面纱吗? 有趣的使用C#收益 关键词 什么是yield关键字 我正在寻找什么时候不使用yield return想法。 例如,如果我期望需要返回集合中的所有项目,那么yield 似乎不会有用,对吧? 有什么情况下使用yield将是有限的,不必要的,让我陷入困境,否则应该避免?
yield关键字是C#中的关键字之一,它继续使我迷惑,而且我从来没有确信我正确地使用它。 以下两段代码,哪个是首选,为什么? 版本1:使用收益率回报 public static IEnumerable<Product> GetAllProducts() { using (AdventureWorksEntities db = new AdventureWorksEntities()) { var products = from product in db.Product select product; foreach (Product product in products) { yield return product; } } } 版本2:返回列表 public static IEnumerable<Product> GetAllProducts() { using (AdventureWorksEntities db = new AdventureWorksEntities()) { var products = from product in […]