c#dispose - 这是对的吗?

时间:2014-01-16 16:06:08

标签: c# .net

这是处理和使用

的正确方法吗?
public partial class Form1 : Form
{
    winappContext _context;
    public Form1()
    {
        InitializeComponent();
    }

    private void Form1_Load(object sender, EventArgs e)
    {
        using (_context = new winappContext())
        {
            _context = new winappContext();
            var query = from c in _context.Customers
                        orderby c.CustomerName
                        select c;

            this.customerBindingSource.DataSource = query.ToList();
        }
....

或者我需要调用_context.Dispose()onFormClosing

由于

4 个答案:

答案 0 :(得分:12)

都不是。假设你不需要 _context成为一个字段(没有迹象表明你这样做),你应该把它变成一个局部变量:

private void Form1_Load(object sender, EventArgs e)
{
    using (winappContext _context = new winappContext())
    {
        var query = from c in _context.Customers
                    orderby c.CustomerName
                    select c;

        this.customerBindingSource.DataSource = query.ToList();
    }
}

一般来说,拥有实现IDisposable的字段会很痛苦 - 如果你能够以相同的方法处理资源,它会更加清晰。

另请注意,您的原始代码会创建两个上下文:

using (_context = new winappContext())
{
    _context = new winappContext();
    ...
}

这意味着第一个被自动处理,但第二个没有。如果您尝试在using语句中执行此操作,其中声明该变量作为语句介绍部分的一部分,则该变量是只读的,因此您不能犯这个错误

(您还应该重命名winappContext类以遵循.NET命名约定。)

答案 1 :(得分:0)

“使用”标记(}中的一次性对象在{}结束后处理。所以不行。不要处理,它为你完成。

答案 2 :(得分:0)

您无需调用dispose对象。

Using语句自动释放资源,避免调用Dispose方法。

答案 3 :(得分:0)

您给出的两个例子是等效的。编译器消失,并使用finally括号中调用的Dispose()命令将您的using命令转换为try ...。