当前位置: 首页 > 编程语言 > C#

不好的做法?非正式地分享

时间:2023-04-10 12:36:27 C#

与c#的using语句的不良做法?非正式地使用c#的using语句C#有一个using语句,尤其是对于IDisposable对象。据推测,在using语句中指定的任何对象都将拥有某种应该确定性释放的资源。然而,在我看来,编程中有许多设计具有单一的、定义明确的开始和结束,但缺乏内在的语言支持。using结构提供了使用代码编辑器内置功能的机会,至少清楚自然地突出了此类设计或操作的范围。我正在考虑通常以BeginXXX()和EndXXX()方法开头的操作类型,尽管有许多不同的风格,例如涉及“开始”和“连接”的异步代码执行。以这个天真的例子为例。webDataOperation.Start();GetContentFromHardDrive();webDataOperation.Join();//执行需要来自两个源的数据的操作相反,如果Start方法返回一个其IDisposable.Dispose方法执行连接操作的对象怎么办?使用(webDataOperation.Start()){GetContentFromHardDrive();}//执行需要来自两个源的数据的操作或者,更好的是,我特别想到的是:我有一个高度专业化的图形块传输对象,并且有一个Begin()和End()方法(还有一个设计在DirectX和XNA中)。而不是...using(blitter.BlitOperation()){//Dowork}//Useresult它看起来更自然和可读,但它是不可取的,因为它使用IDisposable接口和using语句用于意想不到的目的吗?换句话说,这是否与非直观方式的运算符运算符相同?这是完全可以接受的做法。这些称为因素类型,是框架设计指南推荐的。基本上,如果类型包装具有特定生命周期的操作,则使用IDisposable和using语句成为适当的考虑因素。我实际上也在这里写过关于这个特定主题的博客。我反对这样做;我的信念是代码旨在与代码的维护者而不是编译器进行有效的沟通,并且维护者的理解应该牢记在心。我尝试只使用“使用”来处理资源,通常是非托管资源。我是少数。大多数人似乎将“使用”用作通用目的“即使抛出异常我也希望运行一些清理代码”机制。我不喜欢这个,因为(1)我们已经有一个叫做“try-finally”的机制,(2)它使用了一个函数,这不是它的目的,以及(3)如果调用清理代码很重要,为什么调用时不可见吗?如果它很重要,那么我希望能够看到它。仅仅因为你可以(或者因为PhilHaack说没关系),并不意味着你应该这样做。基本经验法则:如果我能阅读你的代码并理解它在做什么以及你的意图是什么,那么它是可以接受的。另一方面,如果你需要解释你做了什么,或者你为什么这样做,它可能会在维护代码时绊倒初级开发人员。还有许多其他模式可以通过更好的封装来实现这一点。底线:这种“技术”对你没有任何好处,它只会让其他开发人员感到困惑。这是一种常见的模式,但就我个人而言,当您可以通过更明显的方式使用匿名委托和/或lambda实现相同的效果时,我认为没有理由滥用IDisposable;即:blitter.BlitOperation(delegate{//你的代码});我认为您应该将IDisposable用于它的目的,而不是别的。也就是说,如果可维护性对您很重要。我会说这是可以接受的——事实上,我已经在几个项目中使用了它,在这些项目中我希望在特定代码块的末尾触发一个动作。WesDeyer在他的LINQtoASCIIArt程序中使用它,他称之为一次性操作(Wes在C#编译器团队工作-我相信他的判断:D):http://blogs.msdn.com/wesdyer/archive/2007/02/23/linq-to-ascii-art.aspx类ActionDisposable:IDisposable{动作动作;publicActionDisposable(Actionaction){this.action=action;}#regionIDisposable成员publicvoidDispose(){this.action();}#endregion}现在您可以从您的函数中返回它并执行以下操作:C#学习教程就这些:不好的做法?非正式地使用c#的using语句来分享所有内容。如果对你有用,需要进一步了解C#学习教程,希望你多多关注——}ExtendedConsoleWriter.Write("缩进少");本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: