c#question - 是否有工具来确定我应该/可以使用"using"语句来确保资源关闭?(以避免内存泄漏等)
包括以下两种情况:
a)资源未被关闭
b)语法使用try-catch-finally和identies,这可以改为使用
谢谢
我有两个问题.
1)您是否应始终在连接上使用using语句?那么,我会在连接上使用它,然后在连接中的读者上使用另一个?所以我将使用两个using语句.
2)假设您在连接上使用using语句,并且还在连接上返回读取器.所以你有两个使用语句.它会创建两个Try {} Finally {}块还是只创建一个?
谢谢!
using(SomeClass x = new SomeClass("c:/temp/test.txt"))
{
...
}
Run Code Online (Sandbox Code Playgroud)
在使用块内,一切正常,正常处理异常.但是如果构造函数SomeClass可以抛出异常呢?
如果我使用using关键字,我还需要实现IDisposable吗?
我有一个课程,包括enum:
class appearance{
// ... stuff ...
enum color {BLUE, RED, GREEN};
};
Run Code Online (Sandbox Code Playgroud)
我想附加部分命名空间(with using),以便我可以BLUE简单地引用as 的值BLUE,而不是appearance::BLUE.与此同时,我想保持enum在内class{},因为我认为这是最自然的.我曾尝试各种组合namespace和using,但无济于事.
有什么建议 ???
关于关闭WCF连接的StackOverflow有几个问题,但排名最高的答案是指这个博客:
http://marcgravell.blogspot.com/2008/11/dontdontuse-using.html
当我在服务器上设置断点并让客户端挂起超过一分钟时,我遇到了这种技术的问题.(我故意创建超时异常)
问题是客户端似乎"挂起",直到服务器完成处理.我的猜测是,一切都在异常后被清理干净.
在考虑到TimeOutException它看来,retry()客户端的逻辑将继续一遍一遍重新提交查询到服务器,在那里我可以看到服务器端的调试器排队的请求,然后执行每一个排队的请求同时被.我的代码不希望WCF这样做,可能是我看到的数据损坏问题的原因.
有些东西并没有完全加入这个解决方案.
什么是在WCF代理中处理故障和异常的无所不包的现代方法?
为什么using变量被视为只读?它是c#语言规范还是托管语言规范?这是因为c#是.net语言?提前致谢.
注意:using变量是在using语句中出现的变量
示例代码:
using (Form s = new Form)
{
myfunc(ref s);
}
Run Code Online (Sandbox Code Playgroud)
我们无法在使用块中更改using变量的值.代码会引发错误.
注意:我不想让你讨论readonly关键字.
我正在使用MemoryStream从存储在数据库中的二进制文件中添加附件。我的问题是我想正确处理MemoryStream。使用“ using”语句很容易做到这一点,但是当我有多个附件时,我不知道如何正确处理多个MemoryStream。
有没有很好的方法可以遍历并附加文件,但是同时正确处理了我要附加的MemoryStreams?当我尝试在使用smtp之前刷新/关闭时,通过错误发送它,指出流已经关闭。
任何建议,将不胜感激。
我目前正在使用两个对象,如下所示:
using (var ms = new MemoryStream())
using (var bw = new BinaryWriter(ms))
{
// work with ms and bw, both referenced here
}
Run Code Online (Sandbox Code Playgroud)
它工作"很好",实际上也是一个答案.但是,当我运行VS2012的代码分析工具时,我得到一个警告:
CA2202 Do not dispose objects multiple times
Object 'ms' can be disposed more than once in method '<my method name>'.
To avoid generating a System.ObjectDisposedException you should not
call Dispose more than one time on an object.
Run Code Online (Sandbox Code Playgroud)
这让我相信可能有另一种方法来处理这种情况,但我不知道它是什么.
有谁知道在一个using块中以无警告方式使用两个对象的"正确"方法是什么?
这个问题描述了与CA2202相同的场景,如何解决这种情况,但它不是关于如何修复代码,而是关于为什么首先出现问题.
以下代码:
using (Stream stream = obtainStreamObject())
{
using (var reader = new XmlTextReader(stream))
{
//do something with XmlTextReader
}
}
Run Code Online (Sandbox Code Playgroud)
原因Stream.Dispose()叫两次.首先,内部using块会崩溃,这会调用XmlTextReader.Dispose()哪些调用Stream.Dispose().然后外部using块崩溃并Stream.Dispose()再次被调用.
所以,我必须换Stream到using,但不换行XmlTextReader到using,尽管他们都实现IDisposable.
这会产生CA2202警告
不要多次处理对象对象'stream'可以在方法'MethodName(whatever)'中多次处理.为避免生成System.ObjectDisposedException,不应在对象上多次调用Dispose.
好吧,它说第二个Dispose()可能会屈服ObjectDisposedException.这有什么意义?为什么我会这样实现Dispose(),当它第二次被调用它会抛出异常而不是什么都不做?
using-statement ×10
c# ×9
.net ×6
idisposable ×4
c++ ×1
dispose ×1
enums ×1
exception ×1
memorystream ×1
namespaces ×1
proxy ×1
using ×1
wcf ×1