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

C#ConditionalUseBlockStatement分享

时间:2023-04-11 11:00:25 C#

C#ConditionalUseBlockStatement我有如下代码,但是很别扭。我怎样才能更好地构建它?我是否必须让我的消费类实现IDisposable并有条件地构建网络访问类并在完成后将其处置?protectedvoidValidateExportDirectoryExists(){if(useNetworkAccess){using(newCore.NetworkAccess(username,password,domain)){CheckExportDirectoryExists();}}else{CheckExportDirectoryExists();事实上,只有在null时才调用Dispose,这是一个选项,有点烦人但可行。protectedvoidValidateExportDirectoryExists(){使用(useNetworkAccess?newCore.NetworkAccess(username,password,domain):null){CheckExportDirectoryExists();另一种方法是编写一个返回null或NetworkAccess的静态方法:privateCore.NetworkAccessCreateNetworkAccessIfNecessary(){returnuseNetworkAccess?新的Core.NetworkAccess(用户名、密码、域)):空;}然后:protectedvoidValidateExportDirectoryExists(){using(CreateNetworkAccessIfNecessary()){CheckExportDirectoryExists();}}再一次,我仍然不确定我不喜欢原来的......这真的取决于你多久需要这个mod。如果您在许多方法中重复此模式,则可以打破模式}}else{动作();}}protectedvoidValidateExportDirectoryExists(){OptionalNetworkCall(CheckExportDirectoryExists);}using语句是避免“finally”块的捷径,只应在代码更易于理解时使用。在你的情况下,我会写下面的代码。它可能不像其他一些版本那样简短,但更直接。protectedvoidValidateExportDirectoryExists(){Core.NetworkAccess访问=useNetworkAccess?新的Core.NetworkAccess(用户名、密码、域):空;尝试{CheckExportDirectoryExists()}finally{if(access!=null){access.Dispose();}}}protectedvoidValidateExportDirectoryExists(){varaccess=useNetworkAccess?新的Core.NetworkAccess(用户名、密码、域):空;使用(访问){CheckExportDirectoryExists();我不知道它是否“更好”,但您可以使用空对象模式并拥有一个“空”的一次性网络访问对象。像这样:protectedvoidValidateExportDirectoryExists(){using(GetNetworkAccess(username,password,domain)){CheckExportDirectoryExists();}}protectedIDisposableGetNetworkAccess(字符串用户名,字符串密码,字符串域){返回useNetworkAccess?newCore.NetworkAccess(用户名、密码、域):newNullNetworkAccess(用户名、密码、域);}internalclassNullNetworkAccess:IDisposable{internalNullNetworkAccess(stringusername,stringpassword,stringdomain){}publicvoidDispose(){}}这对他们来说可能太可爱了。[编辑]刚刚在Jon的回答中看到null可以用在using语句中。我不知道!如果类实现了IDisposible接口,则使用作用域只会处理一个对象,所以是的,您需要实现dispose方法。如果代码这么简单,我想这真的很漂亮。我可以想象它看起来如何,我的投票是你现在拥有的这个版本。无论using语句中包含什么,IDispoable.Dispose都由IDispoable.Dispose调用,如IDisposable接口所指定的那样。正如MSDN上所见...提供方便的语法以确保正确使用IDisposable对象。因此,如果您将自定义类型放在using语句中,它应该通过IDisposable接口正确清理其资源。通过让您的类实现IDisposable,只有在使用“using”语句时才会调用dispose方法。否则,您必须显式调用dispose。通常,IDisposable由管理垃圾收集器之外的内存消耗的对象实现(例如,使用非托管代码)。它提供了一种清理任何消耗的内存的方法。只要您的NetworkAccess类实现了IDisposable,就会在using语句的范围完成后立即调用dispose方法。如果它是托管代码,则无需处理它。让垃圾收集器完成它的工作。使用您自己的try/finally块,它执行与“使用”类似的逻辑,但仅在设置了useNetworkAccess时才会释放。请注意,如果useNetworkAccess可能会受到其他线程的影响,您应该复制它的值并使用该副本来创建资源并释放它。以上就是《C#学习教程:C#块语句的条件使用》的全部内容。如果对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权请点击右侧联系管理员删除。如需转载请注明出处: