在C#中使用块的目的是什么?它与局部变量有什么不同?
我有一堆属性,我将使用读/写锁.我可以使用a try finally
或a using
子句来实现它们.
在try finally
我之前try
,我将获得锁定,然后释放finally
.在该using
子句中,我将创建一个在其构造函数中获取锁的类,并在其Dispose方法中释放.
我在很多地方使用读/写锁,所以我一直在寻找可能更简洁的方法try finally
.我有兴趣听听一些关于为什么不推荐一种方式的想法,或者为什么一种方式可能比另一方更好.
方法1(try finally
):
static ReaderWriterLock rwlMyLock_m = new ReaderWriterLock();
private DateTime dtMyDateTime_m
public DateTime MyDateTime
{
get
{
rwlMyLock_m .AcquireReaderLock(0);
try
{
return dtMyDateTime_m
}
finally
{
rwlMyLock_m .ReleaseReaderLock();
}
}
set
{
rwlMyLock_m .AcquireWriterLock(0);
try
{
dtMyDateTime_m = value;
}
finally
{
rwlMyLock_m .ReleaseWriterLock();
}
}
}
Run Code Online (Sandbox Code Playgroud)
方法2:
static ReaderWriterLock rwlMyLock_m = new ReaderWriterLock();
private DateTime dtMyDateTime_m
public …
Run Code Online (Sandbox Code Playgroud) 如果我在一个Using中包装一个SQLConnection,我应该关闭它还是使用句柄来结束它?
using cn as new system.data.sqlclient.sqlconnection()
cn.open
'{do a bunch of other stuff with commands and datareaders here}
cn.close 'Do I need this?
end using
Run Code Online (Sandbox Code Playgroud) use会捕获异常还是抛出异常?即
using (StreamReader rdr = File.OpenText("file.txt"))
{
//do stuff
}
Run Code Online (Sandbox Code Playgroud)
如果streamreader抛出异常是通过使用或抛出来捕获的,那么调用函数可以处理它吗?
在该IDisposable.Dispose
方法中有一种方法可以确定是否抛出异常?
using (MyWrapper wrapper = new MyWrapper())
{
throw new Exception("Bad error.");
}
Run Code Online (Sandbox Code Playgroud)
如果在using
语句中抛出异常,我想在处理IDisposable
对象时知道它.
我想知道什么时候应该而且不应该在USING块中包装东西.
根据我的理解,编译器将其转换为try/finally,最后在对象上调用Dispose().
我总是使用围绕数据库连接和文件访问的USING,但它更多的是习惯而不是100%的理解.我知道你应该明确(或使用)Dispose()控制资源的对象,以确保它们立即释放,而不是每当CLR感觉到它时,但那是我理解失败的地方.
IDisposables在超出范围时是否被处置掉?
当我的对象使用Dispose来整理自己时,我只需要使用USING吗?
谢谢
编辑:我知道USING关键字上还有其他一些帖子,但我对CLR的相关答案更感兴趣,内部究竟是什么
安德鲁
我经常使用看起来像这样的模式.我想知道这是否正常,或者是否有最佳实践我不在这里申请.
具体来说,我在想; 在抛出异常的情况下,我在finally块中的代码足以确保连接被正确关闭?
public class SomeDataClass : IDisposable
{
private SqlConnection _conn;
//constructors and methods
private DoSomethingWithTheSqlConnection()
{
//some code excluded for brevity
try
{
using (SqlCommand cmd = new SqlCommand(SqlQuery.CountSomething, _SqlConnection))
{
_SqlConnection.Open();
countOfSomething = Convert.ToInt32(cmd.ExecuteScalar());
}
}
finally
{
//is this the best way?
if (_SqlConnection.State == ConnectionState.Closed)
_SqlConnection.Close();
}
//some code excluded for brevity
}
public Dispose()
{
_conn.Dispose();
}
}
Run Code Online (Sandbox Code Playgroud) using
访问数据库时,我有很多块.我想知道 - 如果必须在使用块中抛出异常,是否仍然会处理必要的资源,即使未到达块的末尾?或者我需要在catch
块中手动关闭它们吗?
using (FileStream fileStream = new FileStream(path))
{
// do something
}
Run Code Online (Sandbox Code Playgroud)
现在我知道using模式是IDisposable的一个实现,即设置了Try/Catch/Finally并在对象上调用Dispose.我的问题是如何处理Close方法.
MSDN说它没有被调用,但我已经读过了.
我知道FileStream继承自Stream,这里解释了.现在说不要覆盖Close(),因为它是由Dispose()调用的.
那么有些类只是在Dispose()方法中调用Close()或者使用调用Close()吗?
在C#中,如果在"using"块内发生异常,是否会调用Dispose方法?
我正在处理我需要访问数据库的应用程序.使用using语句很好,因为"using" statement is to ensure that the object is always disposed correctly, and it doesn't require explicit code to ensure that this happens.
我有点困惑在哪里使用"使用",哪里不使用.
public int route(Route r)
{
try
{
using (SqlConnection con = new SqlConnection(connectionString))
{
using(SqlCommand com = new SqlCommand("",con))
{
using (SqlDataReader sdr = com.ExecuteReader())
{
}
}
}
}
catch (Exception e)
{
}
}
Run Code Online (Sandbox Code Playgroud) 我从像许多来源理解这个和这个,该Dispose
的方法IDisposable
如果有异常被抛出总是被称为Using
块.那么我有这个代码:
static class MainEntryPoint
{
static void Main(string[] args)
{
AppDomain.CurrentDomain.UnhandledException += HandleUnhandledException;
using (var x = new Disposable())
{
throw new Exception("asdfsdf");
}
}
private static void HandleUnhandledException(Object sender, System.UnhandledExceptionEventArgs e)
{
Environment.Exit(0);
}
}
class Disposable : IDisposable
{
public void Dispose()
{
System.Diagnostics.Debug.Print("I am disposed");
}
}
Run Code Online (Sandbox Code Playgroud)
当抛出未处理的异常时,它退出应用程序.Dispose
永远不会调用该方法.为什么?