在大多数情况下,C# 编译器似乎可以自动调用 Dispose()。像大多数 using 模式的情况一样:
public void SomeMethod()
{
...
using (var foo = new Foo())
{
...
}
// Foo isn't use after here (obviously).
...
}
因为 foo 没有被使用(这是一个非常简单的检测)并且因为它没有作为参数提供给另一个方法(这是一个适用于许多用例并且可以扩展的假设),编译器可以自动并立即调用Dispose(),而无需开发人员要求。
这意味着在大多数情况下,如果编译器做了一些聪明的工作,using 就毫无用处。 IDisposable 对我来说似乎低级足以被编译器考虑。
现在为什么不这样做呢?这不会提高性能吗(如果开发人员......肮脏)。
最佳答案
几点:
调用 Dispose 不会提高性能。 IDisposable 专为您使用运行时无法解释的有限和/或非托管资源的情况而设计。
关于编译器如何处理代码中的 IDisposable 对象,没有明确和明显的机制。是什么让它成为自动处理的候选者,什么不是?实例是否(或可能)暴露在方法之外?没什么好说的,仅仅因为我将一个对象传递给另一个函数或类,我希望它可以超出方法的范围使用
例如,考虑一个采用 Stream 并反序列化类实例的工厂模式。
public class Foo
{
public static Foo FromStream(System.IO.Stream stream) { ... }
}
我称之为:
Stream stream = new FileStream(path);
Foo foo = Foo.FromStream(stream);
现在,我可能希望也可能不希望在方法退出时处理掉 Stream。如果 Foo 的工厂从 Stream 中读取了所有必要的数据并且不再需要它,那么我希望将其处理掉。如果 Foo 对象必须保留流并在其生命周期内使用它,那么我不希望它被处理掉。
同样,从构造函数以外的对象中检索到的实例又如何呢,例如 Control.CreateGraphics() 。这些实例可能 存在于代码之外,因此编译器不会自动处理它们。
赋予用户控制权(并提供像 using block 这样的惯用语)使用户的意图更加明确,并且更容易发现 IDisposable 实例未被正确处理的地方。如果编译器要自动处理一些实例,那么调试就会困难得多,因为开发人员必须破译自动处理规则如何应用于使用 IDisposable 对象的每个代码块.
最后,(按照惯例)在类型上实现 IDisposable 有两个原因。
IDisposable 的实例,当该对象的生命周期结束时,应将其丢弃。在第一种情况下,所有此类类型都应该实现调用 Dispose 的终结器,并在开发人员未能这样做时释放所有非托管资源(这是为了防止内存和处理泄漏)。
关于c# - 为什么 'using' 提高了 C# 性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3062586/
类classAprivatedeffooputs:fooendpublicdefbarputs:barendprivatedefzimputs:zimendprotecteddefdibputs:dibendendA的实例a=A.new测试a.foorescueputs:faila.barrescueputs:faila.zimrescueputs:faila.dibrescueputs:faila.gazrescueputs:fail测试输出failbarfailfailfail.发送测试[:foo,:bar,:zim,:dib,:gaz].each{|m|a.send(m)resc
我正在尝试测试是否存在表单。我是Rails新手。我的new.html.erb_spec.rb文件的内容是:require'spec_helper'describe"messages/new.html.erb"doit"shouldrendertheform"dorender'/messages/new.html.erb'reponse.shouldhave_form_putting_to(@message)with_submit_buttonendendView本身,new.html.erb,有代码:当我运行rspec时,它失败了:1)messages/new.html.erbshou
我有一个模型:classItem项目有一个属性“商店”基于存储的值,我希望Item对象对特定方法具有不同的行为。Rails中是否有针对此的通用设计模式?如果方法中没有大的if-else语句,这是如何干净利落地完成的? 最佳答案 通常通过Single-TableInheritance. 关于ruby-on-rails-Rails-子类化模型的设计模式是什么?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.co
我在我的项目目录中完成了compasscreate.和compassinitrails。几个问题:我已将我的.sass文件放在public/stylesheets中。这是放置它们的正确位置吗?当我运行compasswatch时,它不会自动编译这些.sass文件。我必须手动指定文件:compasswatchpublic/stylesheets/myfile.sass等。如何让它自动运行?文件ie.css、print.css和screen.css已放在stylesheets/compiled。如何在编译后不让它们重新出现的情况下删除它们?我自己编译的.sass文件编译成compiled/t
我正在使用的第三方API的文档状态:"[O]urAPIonlyacceptspaddedBase64encodedstrings."什么是“填充的Base64编码字符串”以及如何在Ruby中生成它们。下面的代码是我第一次尝试创建转换为Base64的JSON格式数据。xa=Base64.encode64(a.to_json) 最佳答案 他们说的padding其实就是Base64本身的一部分。它是末尾的“=”和“==”。Base64将3个字节的数据包编码为4个编码字符。所以如果你的输入数据有长度n和n%3=1=>"=="末尾用于填充n%
我主要使用Ruby来执行此操作,但到目前为止我的攻击计划如下:使用gemsrdf、rdf-rdfa和rdf-microdata或mida来解析给定任何URI的数据。我认为最好映射到像schema.org这样的统一模式,例如使用这个yaml文件,它试图描述数据词汇表和opengraph到schema.org之间的转换:#SchemaXtoschema.orgconversion#data-vocabularyDV:name:namestreet-address:streetAddressregion:addressRegionlocality:addressLocalityphoto:i
为什么4.1%2返回0.0999999999999996?但是4.2%2==0.2。 最佳答案 参见此处:WhatEveryProgrammerShouldKnowAboutFloating-PointArithmetic实数是无限的。计算机使用的位数有限(今天是32位、64位)。因此计算机进行的浮点运算不能代表所有的实数。0.1是这些数字之一。请注意,这不是与Ruby相关的问题,而是与所有编程语言相关的问题,因为它来自计算机表示实数的方式。 关于ruby-为什么4.1%2使用Ruby返
我在我的项目中添加了一个系统来重置用户密码并通过电子邮件将密码发送给他,以防他忘记密码。昨天它运行良好(当我实现它时)。当我今天尝试启动服务器时,出现以下错误。=>BootingWEBrick=>Rails3.2.1applicationstartingindevelopmentonhttp://0.0.0.0:3000=>Callwith-dtodetach=>Ctrl-CtoshutdownserverExiting/Users/vinayshenoy/.rvm/gems/ruby-1.9.3-p0/gems/actionmailer-3.2.1/lib/action_mailer
在MRIRuby中我可以这样做:deftransferinternal_server=self.init_serverpid=forkdointernal_server.runend#Maketheserverprocessrunindependently.Process.detach(pid)internal_client=self.init_client#Dootherstuffwithconnectingtointernal_server...internal_client.post('somedata')ensure#KillserverProcess.kill('KILL',
刚入门rails,开始慢慢理解。有人可以解释或给我一些关于在application_controller中编码的好处或时间和原因的想法吗?有哪些用例。您如何为Rails应用程序使用应用程序Controller?我不想在那里放太多代码,因为据我了解,每个请求都会调用此Controller。这是真的? 最佳答案 ApplicationController实际上是您应用程序中的每个其他Controller都将从中继承的类(尽管这不是强制性的)。我同意不要用太多代码弄乱它并保持干净整洁的态度,尽管在某些情况下ApplicationContr