我知道很多例子都存在,其中定义了SqlConnection,然后在Using块中定义了SqlCommand:
using (var conn = new SqlConnection(connString)) {
using (var cmd = new SqlCommand()) {
cmd.Connection = conn;
//open the connection
}
}
Run Code Online (Sandbox Code Playgroud)
我的问题:如果我直接在SqlCommand上定义连接,那么当命令被释放时连接是否会关闭?
using (var cmd = new SqlCommand()) {
cmd.Connection = new SqlConnection(connString);
//open the connection
}
Run Code Online (Sandbox Code Playgroud) 哪种方式更好的做法:从using语句中的方法返回一个值或者之前声明一个变量,将其设置在内部并在之后返回?
public int Foo()
{
using(..)
{
return bar;
}
}
Run Code Online (Sandbox Code Playgroud)
要么
public int Foo()
{
var b = null;
using(..)
{
b = bar;
}
return b;
}
Run Code Online (Sandbox Code Playgroud) 通常我做的就是这样(只是一个例子):
using (Stream xmlStream = client.OpenRead(xmlUrl))
{
using (XmlTextReader xmlReader = new XmlTextReader(xmlStream))
{
}
}
Run Code Online (Sandbox Code Playgroud)
不仅仅是做得更好:
using (XmlTextReader xmlReader = new XmlTextReader(client.OpenRead(xmlUrl)))
{
}
Run Code Online (Sandbox Code Playgroud)
但是我不确定在这个简短的语法中是否所有资源都将被处理(流)或只有XmlTextReader?
提前感谢您的回答.
假设我有这样的方法:
public byte[] GetThoseBytes()
{
using (System.IO.MemoryStream ms = new System.IO.MemoryStream())
{
ms.WriteByte(1);
ms.WriteByte(2);
return ms.ToArray();
}
}
Run Code Online (Sandbox Code Playgroud)
这还会处理'ms'对象吗?我有疑问,可能是因为在语句块完成之前返回了一些东西.
谢谢,AJ.
我正在阅读这种情况,其中使用C#using语句可能会导致问题.如果在using语句末尾调用的Dispose函数也抛出异常,则可能会丢失在using块范围内抛出的异常.这突出了在决定是否添加using语句时应特别注意某些情况.
在使用流和从DbConnection派生的类时,我只倾向于使用using语句.如果我需要清理非托管资源,我通常更喜欢使用finally块.
这是IDisposable接口的另一个用途,用于创建一个性能计时器,该计时器将停止计时器并将时间记录到Dispose函数中的注册表中. http://thebuildingcoder.typepad.com/blog/2010/03/performance-profiling.html
这是IDisposable接口的好用吗?它不会清理资源或处理任何其他对象.但是,我可以看到它如何清理调用代码,方法是在using语句中包装整齐的代码.
是否应该永远不使用using语句和IDisposable接口?在using语句中实现IDisposable或包装代码之前是否给您带来了问题?
谢谢
我们有一个包含数千个表单的Windows窗体应用程序.
其中许多通过ShowDialog()方法临时显示为对话框.
这个应用程序已存在多年,我们发现由于表单中的各种资源泄漏或它使用的控件,许多表单没有及时收集垃圾.
具体来说,我们已经找到了未正确处理的GDI +资源的示例,尽管可能还有其他类型的资源泄漏尚未被描述.
虽然解决这个问题的正确方法显然是要经历每一种形式和每一种控制,并消除所有的资源问题.这需要一些时间来完成.
作为一个短期的替代方案,我们发现在表单上显式调用Dispose()似乎启动了垃圾收集过程,并且表单及其资源立即被释放.
我的问题是,在一个using语句中包装每个表单的ShowDialog()块是否是一个合理的解决方法,以便在显示表单后调用Dispose(),这也是一个很好的做法吗?
例如,从以下位置更改现有代码:
public void ShowMyForm()
{
MyForm myForm = new MyForm();
myForm.ShowDialog();
}
Run Code Online (Sandbox Code Playgroud)
对此:
public void ShowMyForm()
{
using (MyForm myForm = new MyForm())
{
myForm.ShowDialog();
}
}
Run Code Online (Sandbox Code Playgroud)
在我们的测试中,第一个示例永远不会调用MyForm的Dispose()方法,但第二个示例会立即调用它.
当我们花时间追踪每个特定的资源问题时,这似乎是一种合理的方法作为短期解决方法吗?
我们是否可以考虑采用其他方法来确定和解决这些类型的资源问题的短期解决方法和/或方法?
c# garbage-collection using-statement resource-leak winforms
我对所有关于IDispose和"使用"语句的讨论感到困惑.我想知道是否有人可以告诉我是否需要在以下测试示例中使用"using"语句或IDispose的某种实现...
public class Main()
{
MyFile myFile = new MyFile("c:\subdir\subdir2\testFile.txt");
Console.Writeline("File Name: " + myFile.FileName() + "File Size: " + myFile.FileSize());
}
public class MyFile
{
private FileInfo _fInfo;
public MyFile(string fullFilePath)
{
_fInfo = new FileInfo(fullFilePath);
}
public string FileName()
{
return _fInfo.Name;
}
public long FileSize()
{
return _fInfo.Length;
}
}
Run Code Online (Sandbox Code Playgroud) 可能重复:
什么是C#使用块,为什么要使用它?
我正在将旧网站转换为C#,我不确定何时应该使用'使用'.有没有一般指导方针?我知道它的好处,但我并不是100%确定如何使用它.是每次我'新'的方法/财产?
SqlConnection awesomeConn = new SqlConnection(connection);
Run Code Online (Sandbox Code Playgroud) 我们都知道该using语句非常适合您想要及时清理的资源,例如打开文件或数据库连接.
我想知道在资源清理不是Dispose()方法的目标而是重置为先前状态的情况下使用该语句是否是一件好事.
例如,一个允许using语句包装过程的类,该过程需要花费大量时间并将Cursor更改为等待状态.
class CursorHelper : IDisposable
{
readonly Cursor _previousState;
public CursorHelper(Cursor newState)
{
_previousState = Cursor.Current;
Cursor.Current = newState;
}
public void Dispose()
{
Cursor.Current = _previousState;
}
}
Run Code Online (Sandbox Code Playgroud)
然后可以这样使用类,而不必担心在完成后还原Cursor.
public void TimeIntensiveMethod()
{
using (CursorHelper ch = new CursorHelper(Cursors.WaitCursor))
{
// something that takes a long time to complete
}
}
Run Code Online (Sandbox Code Playgroud)
这是否适用于该using声明?
我有这个代码,我担心它"不安全"我在使用语句结束之前使用了Dispose(),对我来说它有点不合逻辑,但它工作得很好.那么,这样安全吗?
using (FileStream stream = new FileStream(SfilePath, FileMode.Open))
{
try
{
XmlSerializer deserializer = new XmlSerializer(typeof(HighscoresViewModel));
HVM = deserializer.Deserialize(stream) as HighscoresViewModel;
}
catch (InvalidOperationException)
{
stream.Dispose();
(new FileInfo(SfilePath)).Delete();
HVM = new HighscoresViewModel();
}
}
Run Code Online (Sandbox Code Playgroud)