标签: using-statement

重新使用GDI +对象的做法不好吗?(或:如何使用许多嵌套使用块而不会头疼?)

我正在为用户控件编写一个相当复杂的绘制方法,涉及大量的绘图代码.我知道所有GDI +资源都需要妥善处理,所以我将每个资源包装在一个using块中.

但当我注意到我使用using了三个不同的三个块时,SolidBrushes我想知道我是否不能再重复使用它们.创建一个SolidBrush,用它绘制,分配不同的颜色,绘制其他东西等.然后放在Dispose()最后.

这样的事情是可取的还是我在这里想的太难了?我并不特别喜欢using彼此嵌套的太多块.虽然一个很好的模式,但它有时会妨碍可读性.

c# gdi+ dispose using-statement

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

使用基类的所有重载

当子类重写基类的方法时,子类中不能获得所有基类的重载.为了使用它们,应该using BaseClass::Method;在子类中添加一行.

是否有一种快速方法可以为所有重写方法设置基类的重载?(不需要using ...为每个方法明确指定)

c++ inheritance overriding overloading using-statement

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

我应该使用哪些类使用C#的using语句?

我已阅读并且我相信我理解C#的using语句是什么(如果我错了请纠正我):将IDisposable对象初始化为只读有限范围(using块).我知道你可以在之前初始化using并且不限制范围,但建议不要这样:

http://msdn.microsoft.com/en-us/library/yh598w02.aspx

我并不总是关注哪些类是什么类的子类.我不太确定哪些类继承自IDisposable.我不只是好奇在一个using语句中可以使用哪些类,但是我的同事希望在一个using块中找到哪些类?块中应该包含哪些类using?另外,没有使用using块而不调用Dispose 有什么问题吗?它只是关于记忆还是稳定?

c# using-statement

3
推荐指数
2
解决办法
1861
查看次数

整个类的C#IDisposable对象

我正在处理的项目在类中的每个方法中使用IDisposable对象.它已经开始在每个方法的开头重新输入使用块的繁琐乏味,并且想知道是否有一种方法来指定用于类的每个方法的一次性变量?

public static class ResourceItemRepository
{
    public static ResourceItem GetById(int id)
    {
        using (var db = DataContextFactory.Create<TestDataContext>())
        {
            // Code goes here...
        }
    }
    public static List<ResourceItem> GetInCateogry(int catId)
    {
        using (var db = DataContextFactory.Create<TestDataContext>())
        {
            // Code goes here...
        }
    }
    public static ResourceItem.Type GetType(int id)
    {
        using (var db = DataContextFactory.Create<TestDataContext>())
        {
            // Code goes here...
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

c# code-reuse refactoring using-statement

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

将一个使用块包装在另一个使用块内 - 是否有点过分?

我在我的项目中有一段代码,我在另一个使用块中包含一个使用块,我想知道这是一个好习惯还是矫枉过正(请注意我明白这是一个非常简单的代码片段,它是仅用于说明目的):

protected void Submit_Click(object sender, EventArgs e)
    {
        try
        {
            using (SqlConnection cn = new SqlConnection(ConfigurationManager.ConnectionStrings["RegConnectionString"].ConnectionString))
            {
                cn.Open();

                string cmdStr = "SELECT COUNT(*) FROM REGISTRATION WHERE UserName ='" + this.TextBoxUN.Text + "' ";
                using (SqlCommand selectUser = new SqlCommand(cmdStr, cn))
                {
                    int temp = Convert.ToInt32(selectUser.ExecuteScalar().ToString());

                    if (temp == 0)
                    {
                        string insCmd = "Insert INTO REGISTRATION (UserName, Password, EmailAddress, FullName, Country) VALUES (@UserName, @Password, @EmailAddress, @FullName, @Country)";
                        using (SqlCommand insertUser = new SqlCommand(insCmd, cn))
                        {
                            try
                            {
                                insertUser.Parameters.AddWithValue("@UserName", this.TextBoxUN.Text);
                                insertUser.Parameters.AddWithValue("@Password", …
Run Code Online (Sandbox Code Playgroud)

c# using-statement

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

如何在using语句中使用对象初始值设定项?

有没有办法重构这个代码,不必使用临时变量,仍然使用与对象初始化器相关的语法糖?

FrmSomeForm someTempForm = new FrmSomeForm()
{
    SomePropA = "A",
    SomePropB = "B",
    SomePropC = "C"
};
using (FrmSomeForm someForm = someTempForm)
{
    someForm.ShowDialog();
}
Run Code Online (Sandbox Code Playgroud)

c# refactoring using using-statement

3
推荐指数
2
解决办法
238
查看次数

正确使用范围

我正和一位同事讨论使用声明的适当范围.这是有问题的方法.

public Guid IsServerReachable()
{
  try
  {
    WhoAmIResponse whoAmI;
    using (OrganizationServiceProxy service = GetService())
      whoAmI = service.Execute(new WhoAmIRequest()) as WhoAmIResponse;
    return whoAmI.UserId;
  }
  catch { return Guid.Empty; }
}
Run Code Online (Sandbox Code Playgroud)

我们中的一个人声称using语句应该包含whyAmI的声明,而另一个声明它只是需要使用ified服务实例.我不是说我的理论是哪一个,但显然是错误的.哪一个?

c# scope using-statement

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

从using块中返回IQueryable.需要更好的设计

我创建了一个PhoneBook风格的应用程序; 在我的电话簿对象上,我有一个本地成员_site用作过滤器,因为大约有1000个电话号码,分成我组织内的12个站点.使用此方法一次只能检索一个站点.

这是我原来的方法.GUI具有重新排序的数据的方法,所以我把它作为一个IQueryable,因为我想推迟SQL允许过滤要在SQL服务器上,而不是在客户端PC上完成的.

作品

public IQueryable<PhoneNumber> GetPhoneDirectory()
{
    PhoneBookDataContext db = new PhoneBookDataContext())
    return db.PhoneNumbers.Where(d => d.Site == _site);
}
Run Code Online (Sandbox Code Playgroud)

但是,我也在努力保持using声明方面的"最佳实践" .

不起作用

public IQueryable<PhoneNumber> GetPhoneDirectory()
{
    using (PhoneBookDataContext db = new PhoneBookDataContext())
    {
        return db.PhoneNumbers.Where(d => d.Site == _site);
    }
}
Run Code Online (Sandbox Code Playgroud)

正如@justanotheruseryoumay指出的那样,这将导致异常,因为datacontext在访问对象时被释放.

我想我是问,我怎么能保证我的数据上下文是很好的布置,当我不能使用"使用"的语句并在上下文与做不严格知道.

c# linq using-statement linq-to-sql

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

当程序强制关闭时,"使用"块是否释放资源

按标题提问.

我有一段代码可以做到这一点:

    using (SqlConnection dbcon = new SqlConnection(connectionString))
    using (SqlDataAdapter dataAdapter = new SqlDataAdapter(statement, dbcon))
    {
        dat_set = new System.Data.DataSet();

        dbcon.Open();
        dataAdapter.Fill(dat_set, name);  
    }
Run Code Online (Sandbox Code Playgroud)

当我在dataAdapter仍然填充数据集时强制退出程序时,程序冻结并停止响应.

我知道"使用"块在超出范围时释放资源,但在强制终止的情况下,资源是否优雅地释放?

c# dispose idisposable using-statement

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

引用using()块之外的对象

关于这个主题有很多问题,但是我没有找到一个涵盖我特别需要理解的内容.

我的一位开发人员编写了这段代码:

//

    //  ValidationDataTable is a typed DataTable, generated by the Framework
    ValidationDataTable  validationTable;
    using (ValidationTableAdapter adapter = new ValidationTableAdapter ()) {
        using (validationTable = adapter.GetData()) { }
    }

    datafeedValidators.Add(new CountryFieldValidator(validationTable.ToDictionary(key => key.CountryCode, value => value.CountryName)));

    //  Party on...

//
Run Code Online (Sandbox Code Playgroud)

我的理解:本validationTable已被释放,但是当它在过去的代码生产线的引用不收集垃圾-但应该还是有抛出ObjectDisposedException.ToDictionary()呼叫.但是这段代码很乐意构建一个有效的字典并继续前进.

我有理论,但找不到确定或击落其中任何一个的确定性.并且可以通过十几种方式重写代码以避免问题; 那不是问题.我只需要知道我理解的差距是什么.

我的问题:

  1. 这段代码是否有效并且表现得如此?
  2. 如果没有,我们看到的成功是否只是一个废话?
  3. DataTable在处理对象之后是否存在允许访问的特定内容- 类似于GZipStream类要求您处理对象以刷新流的方式,因此允许在对象被处理之后.ToArray().GetBuffer()之后调用?
  4. ...当你调用方法时,实际上是什么导致抛出ObjectDisposedException?我一直认为它来自.NET框架本身.

.

澄清:

这是一个.NET Framework问题.共识是我的理解是正确的 - DataTable本身必须抛出ObjectDisposedException.除了它没有.不是DataTable源代码中的任何地方 - 因此我的要求.我假设框架将在它被处理后确保一个ObjectDisposedException,这显然不是这种情况......与GZipStream不同,GZipStream只允许在Dispose()之后访问两个方法,即DataTable DGAF.精细.

因此,让我重新解释一个问题:DataTable内部是否有任何内容可以轰炸我们,因为允许调用已分配的表?我可以假设微软没有在内部清理任何内容,只要对象在范围内,所有属性和值都将保持不变,这似乎不是一个安全的假设.这段代码无论如何都会消失 - 我只是想了解微软是否允许访问DataTable,Dispose()或者是疏忽,而不是关心等等.

此外,如果您投票或投票关闭它,请留下评论原因.

c# dispose idisposable using using-statement

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