我有以下代码,但它很尴尬.我怎么能更好地构建它?我是否必须使我的消费类实现IDisposable并有条件地构建网络访问类并在我完成后处理它?
protected void ValidateExportDirectoryExists()
{
if (useNetworkAccess)
{
using (new Core.NetworkAccess(username, password, domain))
{
CheckExportDirectoryExists();
}
}
else
{
CheckExportDirectoryExists();
}
}
Run Code Online (Sandbox Code Playgroud) 我只是看着使用声明,我一直都知道它的作用,但直到现在还没有尝试使用它,我已经提出了以下代码:
using (SqlCommand cmd =
new SqlCommand(reportDataSource,
new SqlConnection(Settings.Default.qlsdat_extensionsConnectionString)))
{
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.Add("@Year", SqlDbType.Char, 4).Value = year;
cmd.Parameters.Add("@startDate", SqlDbType.DateTime).Value = start;
cmd.Parameters.Add("@endDate", SqlDbType.DateTime).Value = end;
cmd.Connection.Open();
DataSet dset = new DataSet();
new SqlDataAdapter(cmd).Fill(dset);
this.gridDataSource.DataSource = dset.Tables[0];
}
Run Code Online (Sandbox Code Playgroud)
这似乎是工作,但有没有因为就在这个任何一点我可以告诉我还需要附上这在try catch块捕捉不可预见的错误,例如SQL服务器停机.我错过了什么吗?
据我目前所知,它只是阻止我关闭和处理cmd,但由于仍需要try catch,因此会有更多行代码.
我刚读完"Nutshell中的C#4.0"(O'Reilly),我认为这对于愿意转向C#的程序员来说是一本好书,但它让我感到疑惑.我的问题是using声明的定义.根据这本书(第138页),
using (StreamReader reader = File.OpenText("file.txt")) {
...
}
Run Code Online (Sandbox Code Playgroud)
恰好相当于:
StreamReader reader = File.OpenText("file.txt");
try {
...
} finally {
if (reader != null)
((IDisposable)reader).Dispose();
}
Run Code Online (Sandbox Code Playgroud)
但是,假设这是真的,并且此代码在单独的线程中执行.此线程现在已中止thread.Abort(),因此ThreadAbortException抛出a并假设线程正好在初始化读取器之后和输入try..finally子句之前.这意味着读者不会被处置!
一种可能的解决方案是以这种方式编码:
StreamReader reader = null;
try {
reader = File.OpenText("file.txt");
...
} finally {
if (reader != null)
((IDisposable)reader).Dispose();
}
Run Code Online (Sandbox Code Playgroud)
这将是中止安全的.
现在我的问题:
using声明是不是中止安全还是错误,它的行为与我的第二个解决方案相似?using等同于第一方案(不放弃安全的),为什么它检查null的finally?ThreadAbortException可以在托管代码中的任何位置抛出.但也许有例外,第一个变种毕竟是中止安全的?编辑:我知道使用thread.Abort()不被认为是好习惯.我的兴趣是纯粹的理论:如何在using声明中表现究竟?
我想使用API从interwebz获取信息.API以Json格式返回数据.
要显示的代码不多,因为没有适当的using语句我就无法真正开始...
using System;
using System.Collections.Generic;
using System.Linq;
using System.Windows.Forms;
using System.Net;
using System.Runtime.Serialization.Json;
Run Code Online (Sandbox Code Playgroud)
我收到此错误:
名称空间'System.Runtime.Serialization'中不存在类型或命名空间名称'Json'(您是否缺少程序集引用?)
我错过了一个DLL文件或什么?基于我徒劳无功地搜索解决方案的时间,我明白.NET 4.xx应该已经拥有解析Json格式化字符串所需的工具?
正如Eric Gunnerson在这篇博文中所展示的那样,在C#中你可以将using语句嵌套为:
using (StreamWriter w1 = File.CreateText("W1"))
using (StreamWriter w2 = File.CreateText("W2"))
{
// code here
}
Run Code Online (Sandbox Code Playgroud)
在VB.Net中有类似的方法吗?我想避免太多的缩进级别.
我有一个关于MVC的项目.我们为数据库交易选择了EF.我们为BLL层创建了一些管理器.我找到了很多例子,其中使用了" using"语句,即
public Item GetItem(long itemId)
{
using (var db = new MyEntities())
{
return db.Items.Where(it => it.ItemId == itemId && !it.IsDeleted).FirstOrDefault();
}
}
Run Code Online (Sandbox Code Playgroud)
这里我们创建一个新的DBcontext实例MyEntities().我们使用" using"以"确保正确使用IDisposable对象".
这只是我经理中的一种方法.但我有十多个.每当我从管理器调用任何方法时,我将使用" using"statemant并在内存中创建另一个DBcontext.什么时候垃圾收集器(GC)会处理它们?谁知道?
但是还有另一种使用管理器方法的方法.我们创建一个全局变量:
private readonly MyEntities db = new MyEntities();
Run Code Online (Sandbox Code Playgroud)
并在没有" using"语句的每个方法中使用DBcontext .方法看起来像这样:
public Item GetItem(long itemId)
{
return db.Items.Where(it => it.ItemId == itemId && !it.IsDeleted).FirstOrDefault();
}
Run Code Online (Sandbox Code Playgroud)
问题:
usage"语句(因为它会影响性能)怎么办 - GC会为此做些什么呢?我是EF使用中的"新手",但仍然没有找到这个问题的明确答案.
c# garbage-collection entity-framework using-statement dbcontext
可能重复:
try/catch + using,正确的语法
我想要try/catch以下内容:
//write to file
using (StreamWriter sw = File.AppendText(filePath))
{
sw.WriteLine(message);
}
Run Code Online (Sandbox Code Playgroud)
我把这些try/catch块放在using声明中还是周围?或两者?
该using语句是否始终处置该对象,即使有一个返回或异常被抛入其中?IE:
using (var myClassInstance = new MyClass())
{
// ...
return;
}
Run Code Online (Sandbox Code Playgroud)
要么
using (var myClassInstance = new MyClass())
{
// ...
throw new UnexplainedAndAnnoyingException();
}
Run Code Online (Sandbox Code Playgroud) 我一直习惯使用变量和赋值.现在我喜欢这个类DbProviderConnection:
public class DbProviderConnection : IDisposable
{
public DbConnection Connection { get; set; }
public DbTransaction Transaction { get; set; }
public DbTransaction BeginTransaction()
{
Transaction = Connection.BeginTransaction();
return Transaction;
}
//... and so on
}
Run Code Online (Sandbox Code Playgroud)
现在我想像这样使用它:
using (DbProviderConnection cnctn = _planDb.CreateOpenConnection())
{
using (cnctn.BeginTransaction())
{
//...
cnctn.Transaction.Commit();
}
}
Run Code Online (Sandbox Code Playgroud)
我的问题是:DbProviderConnection.Transaction.Dispose被叫吗?
如何在Managed C++中编写以下C#代码
void Foo()
{
using (SqlConnection con = new SqlConnection("connectionStringGoesHere"))
{
//do stuff
}
}
Run Code Online (Sandbox Code Playgroud)
Clarificaton: 对于托管对象.
using-statement ×10
c# ×8
using ×2
.net ×1
abort ×1
api ×1
dbcontext ×1
dispose ×1
idisposable ×1
json ×1
managed-c++ ×1
transactions ×1
try-catch ×1
vb.net ×1