类似于我从使用声明中返回的问题(其答案通常是 " 是的,没关系 ")我想知道从foreach语句中返回是否同样没有副作用并被认为是公认的练习,或者当我做这就是我把一个指针挂在中间某个内部的枚举,等等.
这是一个例子:
public string GetCurrentTransaction(string idText)
{
foreach (var transaction in transactions)
{
if (idText.IsEquivalentTo(transaction.IdText))
{
return transaction.Content;
}
}
return "";
}
Run Code Online (Sandbox Code Playgroud) 我正在编写一个IEnumerator<T>类来迭代我正在包装的COM集合.我注意到了扩展,所以我需要实现该方法. IEnumerator<T>IDisposableDispose
但是,我想不出我会放在那里的任何东西,因为我只有一个对集合的引用(我不希望它被放在一个结尾处foreach),以及一个int索引.将Dispose方法留空是否正常?
所以我注意到这段代码有效:
class Program
{
public static void Main()
{
Int32[ ]numbers = {1,2,3,4,5};
using (var enumerator = Data().GetEnumerator())
{
}
}
public static IEnumerable<String> Data()
{
yield return "Something";
}
}
Run Code Online (Sandbox Code Playgroud)
特别是,我对using块感到好奇,因为:
Int32[] numbers = { 1, 2, 3, 4, 5, 6 };
using (var enumerator = numbers.GetEnumerator())
{
}
Run Code Online (Sandbox Code Playgroud)
因编译器错误而失败.显然,yield return返回的类是IDisposable常规数组枚举器不是.所以现在我很好奇:yield return创造了什么?
我阅读了类似问题的已接受答案,部分答案是:
当结构作为参数传递时,它们是按值传递的:它们被复制。现在你有两个具有相同内部字段的结构,它们都将尝试清理同一个对象。一个会首先发生,因此随后使用另一个的代码将开始神秘地失败......然后它自己的清理将失败
同样的问题不也适用于吗Dispose()?如果结构可以实现IDisposable,那么不允许它们具有终结器的原因是什么?
如果终结器的全部目的是Dispose(false)在程序员忘记调用时进行调用Dispose(),并且结构可以具有IDisposable.Dispose(),那么为什么不允许结构的终结器而允许它们用于引用类型呢?