标签: using-statement

C#条件使用块语句

我有以下代码,但它很尴尬.我怎么能更好地构建它?我是否必须使我的消费类实现IDisposable并有条件地构建网络访问类并在我完成后处理它?

    protected void ValidateExportDirectoryExists()
    {
        if (useNetworkAccess)
        {
            using (new Core.NetworkAccess(username, password, domain))
            {
                CheckExportDirectoryExists();
            }
        }
        else
        {
            CheckExportDirectoryExists();
        }
    }
Run Code Online (Sandbox Code Playgroud)

c# idisposable using-statement

30
推荐指数
3
解决办法
1万
查看次数

C#using语句捕获错误

我只是看着使用声明,我一直都知道它的作用,但直到现在还没有尝试使用它,我已经提出了以下代码:

 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,因此会有更多行代码.

c# using using-statement

28
推荐指数
5
解决办法
5万
查看次数

C#的使用语句是否中止?

我刚读完"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)

这将是中止安全的.

现在我的问题:

  1. 这本书的作者是否正确,using声明是不是中止安全还是错误,它的行为与我的第二个解决方案相似?
  2. 如果using等同于第一方案(不放弃安全的),为什么它检查nullfinally
  3. 根据该书(第856页),ThreadAbortException可以在托管代码中的任何位置抛出.但也许有例外,第一个变种毕竟是中止安全的?

编辑:我知道使用thread.Abort()不被认为是好习惯.我的兴趣是纯粹的理论:如何在using声明中表现究竟

c# multithreading using-statement thread-safety abort

28
推荐指数
3
解决办法
3224
查看次数

为什么我不能在C#中引用System.Runtime.Serialization.Json

我想使用API​​从interwebz获取信息.API以Json格式返回数据.

  1. 我正在运行Microsoft Visual Studio C#2010 Express.
  2. 我似乎将.NET Framework 4 Client Profile设置为我的"目标框架",但老实说我不确定这意味着什么.
  3. 这是一个Windows窗体应用程序...

要显示的代码不多,因为没有适当的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格式化字符串所需的工具?

c# api json using-statement

28
推荐指数
3
解决办法
6万
查看次数

嵌套使用语句

正如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中有类似的方法吗?我想避免太多的缩进级别.

vb.net using-statement

27
推荐指数
2
解决办法
4157
查看次数

EF(实体框架)使用"使用"语句

我有一个关于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)

问题:

  1. 使用DBcontext变量的正确方法是什么?
  2. 如果我们不使用" usage"语句(因为它会影响性能)怎么办 - GC会为此做些什么呢?

我是EF使用中的"新手",但仍然没有找到这个问题的明确答案.

c# garbage-collection entity-framework using-statement dbcontext

27
推荐指数
1
解决办法
3万
查看次数

我在哪里将try/catch与"using"语句放在一起?

可能重复:
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声明中还是周围?或两者?

c# using-statement try-catch

23
推荐指数
3
解决办法
4万
查看次数

"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)

c# dispose using using-statement

23
推荐指数
3
解决办法
1万
查看次数

在处理时,没有变量的using语句会做什么?

我一直习惯使用变量和赋值.现在我喜欢这个类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被叫吗?

c# transactions using-statement

22
推荐指数
2
解决办法
4933
查看次数

什么是与C#using语句等效的托管C++

如何在Managed C++中编写以下C#代码

void Foo()
{
    using (SqlConnection con = new SqlConnection("connectionStringGoesHere"))
    {
         //do stuff
    }
}
Run Code Online (Sandbox Code Playgroud)

Clarificaton: 对于托管对象.

.net managed-c++ using-statement

21
推荐指数
1
解决办法
2万
查看次数