我见过有人说使用不带参数的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之后的代码不会).
否则,最后有什么特别之处?
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?
老虎机有5个卷轴,每个卷轴显示3个符号(没有空格或"空"符号).
支付可以以多种方式发生.一些例子...
还有多条支付线需要检查支付.

计算每次旋转奖金的最有效方法是什么?或者,是否有比蛮力更有效的方式将每个支付方案应用于每条支付线?
例如:
Queue<System.Drawing.SolidBrush> brushQ = new Queue<System.Drawing.SolidBrush>();
...
brushQ.Clear();
Run Code Online (Sandbox Code Playgroud)
如果我没有明确地将每个项目出列并单独处理它们,那么在调用Clear()时是否会处理剩余的项目?队列被垃圾收集时怎么样?
假设答案是"不",那么最佳做法是什么?您是否必须始终遍历队列并处理每个项目?
这可能会变得很难看,特别是如果你必须尝试..最终围绕每个dispose,以防万一抛出异常.
编辑
因此,对于通用集合的用户而言,如果项目是Disposable(意味着他们可能正在使用不会被垃圾收集器清理的非托管资源),那么似乎负担很重,那么:
也许通用集合的文档应该提到这一点.
当我运行以下代码时:
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
笔记:
它只发生在我旋转图像,然后绘制一个超出图像原始尺寸的矩形时.
矩形不会截断为原始图像宽度 - 仅绘制矩形的右边缘.
这种情况发生在各种情况中.我首先在一个更复杂的应用程序中注意到它 - 我只是编写了这个应用程序来简单说明问题.
谁能看到我做错了什么?
我有一个线程列表,我正在尝试让我的主线程等待列表中的所有线程终止:
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()时访问消费者.