小编mbe*_*ish的帖子

为什么尝试{...}最终{...}好; 试试{}}抓住{}不好?

我见过有人说使用不带参数的catch是不好的形式,特别是如果catch没有做任何事情:

StreamReader reader=new  StreamReader("myfile.txt");
try
{
  int i = 5 / 0;
}
catch   // No args, so it will catch any exception
{}
reader.Close();
Run Code Online (Sandbox Code Playgroud)

但是,这被认为是好的形式:

StreamReader reader=new  StreamReader("myfile.txt");
try
{
  int i = 5 / 0;
}
finally   // Will execute despite any exception
{
  reader.Close();
}
Run Code Online (Sandbox Code Playgroud)

据我所知,将清理代码放在finally块中并在try..catch块之后放置清理代码之间的唯一区别是,如果你的try块中有return语句(在这种情况下,最后清理代码将是运行,但try..catch之后的代码不会).

否则,最后有什么特别之处?

.net c# exception-handling try-catch try-catch-finally

196
推荐指数
7
解决办法
9万
查看次数

我应该Dispose()DataSet和DataTable吗?

DataSet和DataTable都实现了IDisposable,因此,通过传统的最佳实践,我应该调用它们的Dispose()方法.

但是,从我到目前为止所读到的,DataSet和DataTable实际上并没有任何非托管资源,因此Dispose()实际上并没有做太多.

另外,我不能只使用,using(DataSet myDataSet...)因为DataSet有一组DataTables.

所以,为了安全起见,我需要遍历myDataSet.Tables,处理每个DataTable,然后处理DataSet.

那么,在我的所有DataSet和DataTables上调用Dispose()是否值得麻烦?

附录:

对于那些认为应该处理DataSet的人:通常,处理的模式是使用usingor try..finally,因为你想保证将调用Dispose().

然而,这对于一个集合来说真的很快.例如,如果对Dispose()的一个调用抛出异常,你会怎么做?你吞下它(这是"坏"),以便你可以继续处理下一个元素?

或者,你是否建议我只调用myDataSet.Dispose(),而忘记在myDataSet.Tables中处理DataTables?

datatable dispose idisposable using dataset

187
推荐指数
7
解决办法
10万
查看次数

计算老虎机支出

老虎机有5个卷轴,每个卷轴显示3个符号(没有空格或"空"符号).

支付可以以多种方式发生.一些例子...

  • 出现一个特殊的钻石符号
  • 3幸运7出现
  • 支付线中的所有五个符号都是相同的
  • 所有五个符号都是相同的数字,但颜色不同
  • 等等.

还有多条支付线需要检查支付.

30条不同支付线的例子

计算每次旋转奖金的最有效方法是什么?或者,是否有比蛮力更有效的方式将每个支付方案应用于每条支付线?

language-agnostic algorithm gambling data-structures

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

如果通用集合被实例化以包含iDisposable项目,那么这些项目是否会被处置?

例如:

Queue<System.Drawing.SolidBrush> brushQ = new Queue<System.Drawing.SolidBrush>();
...
brushQ.Clear();
Run Code Online (Sandbox Code Playgroud)

如果我没有明确地将每个项目出列并单独处理它们,那么在调用Clear()时是否会处理剩余的项目?队列被垃圾收集时怎么样?

假设答案是"不",那么最佳做法是什么?您是否必须始终遍历队列并处理每个项目?

这可能会变得很难看,特别是如果你必须尝试..最终围绕每个dispose,以防万一抛出异常.

编辑

因此,对于通用集合的用户而言,如果项目是Disposable(意味着他们可能正在使用不会被垃圾收集器清理的非托管资源),那么似乎负担很重,那么:

  1. 从集合中删除项目时,请确保Dispose()它.
  2. 不要打电话给Clear().迭代收集并处理每个项目.

也许通用集合的文档应该提到这一点.

.net c# idisposable

4
推荐指数
1
解决办法
1671
查看次数

C#,GDI + - 为什么我的矩形会被截断?

当我运行以下代码时:

    private void button1_Click(object sender, EventArgs e)
    {
        Bitmap b = new Bitmap(300, 400);
        using (Graphics g = Graphics.FromImage(b))
        {
            g.FillRectangle(Brushes.Black, new Rectangle(0, 0, 300, 400));
        }

        b.RotateFlip(RotateFlipType.Rotate90FlipNone);

        using (Graphics g2 = Graphics.FromImage(b))
        {
            g2.DrawRectangle(new Pen(Color.White, 7.2f), 200, 100, 150, 100);
        }

        using (Graphics g3 = this.panel1.CreateGraphics())
        {
            g3.DrawImage(b, 0, 0);
        }
    }
Run Code Online (Sandbox Code Playgroud)

我得到以下内容:

alt text http://www.freeimagehosting.net/uploads/2c309ec21c.png

笔记:

  • 它只发生在我旋转图像,然后绘制一个超出图像原始尺寸的矩形时.

  • 矩形不会截断为原始图像宽度 - 仅绘制矩形的右边缘.

  • 这种情况发生在各种情况中.我首先在一个更复杂的应用程序中注意到它 - 我只是编写了这个应用程序来简单说明问题.

谁能看到我做错了什么?

c# gdi+ rotation drawrectangle

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

有什么方法可以自动检查列表项的存在和列表项的调用方法吗?

我有一个线程列表,我正在尝试让我的主线程等待列表中的所有线程终止:

while (consumers.Count > 0) consumers[0].Join();
Run Code Online (Sandbox Code Playgroud)

问题是,这不是原子的,我可以得到一个"索引超出范围"的例外.

有没有任何原子方法来检查消费者[0]的存在并调用消费者[0] .Join()?

注意:我做不到

lock (myLocker) { if (consumers.Count > 0) consumers[0].Join(); }
Run Code Online (Sandbox Code Playgroud)

因为我不想阻止其他线程在加入Join()时访问消费者.

.net c# multithreading

-2
推荐指数
1
解决办法
177
查看次数