变量值类型包装器,传递给迭代器我正在编写一个迭代器,需要传递一个变量整数。publicIEnumerableFoo(refintvalueThatMeansSomething){//Stuffyieldreturn...;这让我“错误476迭代器不能有ref或out参数”。我需要的是在迭代器中修改这个整数值,供迭代器的调用者使用。换句话说,无论上面对Foo()的调用想知道valueThatMeansSomething和Foo()的最终值都可以??使用它自己。真的,我想要一个引用类型的整数,而不是值类型。我唯一能想到的就是写一个封装我的整数的类,允许我修改它。publicclassValueWrapperwhereT:struct{publicValueWrapper(Titem){this.Item=item;}publicTItem{get;放;所以:ValueWrapperw=newValueWrapper(0);foreach(TiteminFoo(w)){//Dostuff}if(w.Item<0){/*Dostuff*/}BCL中是否有任何类或机制来处理这个?上面提出的ValueWrapper有什么缺陷吗?(我的实际使用比上面的例子更复杂,所以在调用Foo()的foreach循环中处理变量不是一个选项。期间。)不,我非常有信心BCL中没有任何东西可以做到这一点。你最好的选择正是你所建议的。ValueWrapper的实现确实不需要比您提议的更复杂。当然,它不能保证是线程安全的,但如果需要,您可以简单地将自动属性转换为带有后备变量的标准属性,并将该字段标记为易失性(以确保该值是最新的每时每刻)。如果您只需要写入值,那么另一种技术是:publicIEnumerableFoo(Actionsetter){...}intvalue=0;foreach(varxinFoo(x=>{value=x;}){...}巧合的是,我将在7月的博客中写一个系列文章,说明为什么迭代器块有这么多愚蠢的限制。“为什么没有参考参数?”将在本系列的较早部分出现。http://blogs.msdn.com/ericlippert/archive/tags/Iterators/default.aspx我一直认为BCL确实应该有一个如下所示的类和接口:publicdelegatevoidActByRef(refT1p1);publicdelegatevoidActByRefRef(refT1p1,refT2p2);公共接口IReadWriteActUpon{T值{get;放;}voidActUpon(ActByRefproc);voidActUpon(ActByRefRefproc,refTExtraparamExtraParam);}publicsealedclassMutableWrapper:IReadWrite{publicTvalue;publicMutableWrapper(Tvalue){this.Value=value;}TIReadWriteActUpon.Value{get{returnthis.Value;}设置{this.Value=value;}}publicvoidActUpon(ActByRefproc){proc(refValue);}publicvoidActUpon(ActByRefRefproc,refTExtraparamExtraParam){proc(refValue,refExtraParam);}}字段通常允许更清晰、更高效的代码,尤其是在使用值类型时。在许多情况下,可以通过使用属性获得的增加的封装对于效率和语义来说可能是值得的,但是当类型的全部目的是完全公开和可变状态类对象时,这种封装会适得其反。.包含该接口并不是因为MutableWrapper的许多用户想要使用该接口,而是因为IReadWriteActUpon在各种情况下都有用,其中一些需要封装,并且有人可能希望将MutableWrapper的实例传递给旨在处理封装的代码IReadWriteActUpon接口中的数据。以上就是C#学习教程:变量值类型包装器,传递给迭代器的全部内容,分享给大家,如果对你有用,需要进一步了解C#学习教程,希望大家多加关注——这篇文章来自网络收集,不代表立场,如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
