javascript

java

python

c#

android

node.js

c++

reactjs

php

html

jquery

css

.net

ios

git

ruby-on-rails

sql

c

string

ruby

c#-using(){}块中的yield return语句在执行之前进行处置

我已经编写了自己的自定义数据层以保留到特定文件,并使用自定义DataContext模式对其进行了抽象。

这全部基于.NET 2.0框架(对目标服务器有限制),因此即使其中一些看起来像LINQ-to-SQL,但事实并非如此! 我刚刚实现了类似的数据模式。

请参阅以下示例,以了解我无法解释的情况。

要获取Animal的所有实例,我可以这样做,并且效果很好

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,我想确保它能快速清理。

现在,如果我将第一个调用包装在using语句中,如下所示

public static IEnumerable<Animal> GetAllAnimals() {
        using(AnimalDataContext dataContext = new AnimalDataContext()) {
            return dataContext.GetAllAnimals();
        }
}

并在AnimalDataContext.GetAllAnimals()方法的第一行放置一个断点,并在AnimalDataContext.Dispose()方法的第一行放置另一个断点,然后执行...

Dispose()方法被称为FIRST,因此AnimalXmlReader.GetNames()给出“对象引用未设置为对象实例”的异常,因为在Dispose()中将AnimalXmlReader设置为null。

有任何想法吗? 我有一种预感,不允许在try-catch块中调用与收益率相关的收益,该收益在编译后使用有效表示...

trans by 2020-02-14T09:40:43Z

Java是否等同于C#的'yield'关键字?

我知道Java本身没有直接的等价物,但也许是第三方?

真的很方便。 目前我想实现一个迭代器,它产生一个树中的所有节点,这是大约五行带有yield的代码。

trans by 2019-07-23T23:26:30Z

在C#中使用yield return迭代器的目的/优势是什么?

我在C#方法中看到的所有使用yield return的例子都可以通过返回整个列表以相同的方式完成。 在这些情况下,使用yield return语法与返回列表有什么好处或好处吗?

此外,在使用哪种类型的场景yield return,你不能只返回完整列表?

trans by 2019-05-24T02:51:34Z

c# - 使用IEnumerable进行嵌套的yield返回

我有以下功能来获取卡的验证错误。 我的问题涉及处理GetErrors。 两种方法都具有相同的返回类型GetMoreErrors

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中的所有错误而无需通过它们进行枚举?

想一想这可能是一个愚蠢的问题,但我想确保我不会出错。

trans by 2019-05-20T04:10:50Z

c# - 何时不使用收益率(返回)

这个问题在这里已有答案:
返回IEnumerable时是否有理由不使用'yield return'?

关于yield的好处,这里有几个有用的问题。例如,

  • 有人可以揭开产量的神秘面纱关键词

  • 有趣地使用c#yield
    关键词

  • 什么是yield关键字

我正在寻找关于何时不使用yield的想法。例如,如果我希望需要返回集合中的所有项目,它似乎不会像yield那样有用,对吧?

使用yield会有什么限制,不必要,让我陷入困境,或者应该避免的情况是什么?

trans by 2019-04-27T19:16:08Z

在C#中,为什么匿名方法不能包含yield语句?

我认为做这样的事情会很好(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();
}

但是,我发现我不能在匿名方法中使用yield。 我想知道为什么。 产量文档只是说它是不允许的。

由于不允许,我只创建了List并将项目添加到其中。

trans by 2019-04-18T23:57:14Z

c# - 正确使用'收益率'

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 db.Product
                       select product;

        return products.ToList<Product>();
    }
}
trans by 2018-12-26T19:52:13Z

1 共1页