静态方法,GDI +,异常处理琐碎问题

时间:2012-02-16 11:02:43

标签: c# asp.net exception-handling null gdi+

我在使用WinForms一段时间后开始编写ASP.NET Web应用程序。在经历了几次试错错误之后,我终于意识到这两者有多么不同。我想知道很多关于C#的高级内容我从未学过琐碎的东西,在推进一些更难的东西之前我应该​​这样做,所以我在这里问,因为有些问题可以解决通过教程而不是开发人员的经验来回答,所以我将开始:

在GDI +中使用图形时这是正确的方法吗?

Bitmap bitmap;
Graphics g;

protected void Page_Load(object sender, EventArgs e)
{
Bitmap bitmap = new Bitmap(200,200);
Graphics g = Graphics.FromImage(bitmap);
}
public void SomeMethod()
{
g.DrawRectangle(somePen,someRectangle);
}
public void SomeOtherMethod()
{
g.DrawRectangle(someOtherPen,someOtherRectangle);
}

示例:

Bitmap bitmap;
Graphics g;

protected void Page_Load(object sender, EventArgs e)
{
Bitmap bitmap = new Bitmap(200,200);
Graphics g = Graphics.FromImage(bitmap);
}
public void SomeMethod()
{
g.DrawRectangle(somePen,someRectangle);
}
public void SomeOtherMethod()
{
g = Graphics.FromImage(bitmap);
g.DrawRectangle(someOtherPen,someOtherRectangle);
}

示例:

Bitmap bitmap;

protected void Page_Load(object sender, EventArgs e)
{
Bitmap bitmap = new Bitmap(200,200);
}
public void SomeMethod()
{
Graphics g = Graphics.FromImage(bitmap);
g.DrawRectangle(somePen,someRectangle);
//Dispose pens,graphics..
}
public void SomeOtherMethod()
{
Graphics g1 = Graphics.FromImage(bitmap);
g1.DrawRectangle(someOtherPen,someOtherRectangle); 
//Dispose pens,graphics..
}

关于静态方法:

我有一堆不适合任何实例类的方法,比如我在app的不同部分需要的一些SQL方法:

  • 我应该创建新的实例类,将所有实例类放入其中。当我 需要其中一个创建我需要的新实例和调用方法。
  • 我应该创建新的静态类,只需调用我需要的那个 没有创建实例。

我学到了静态变量是全局的困难方式,这意味着如果一个用户更改它,另一个用户将在该变量中具有此值。

Static Int ID = 0;
UserA triggers some Sql method to fetch his ID into variable ID.
UserB comes to site and the ID value is UserA ID

静态方法中定义的变量是否共享此行为? 使用静态方法有这样的危险吗?

关于null: 如果确保在该可空类型变量上使用的方法不返回null,那么检查对象是否为空是否真的很麻烦:

List<string> list = new List<string>();
//List can only become null if we call some method that returns null or if we do 
list = null;

关于异常处理: 我读过几个例子,比如“不要抓住你无法处理的例外”,这是什么意思?

为什么把try / catch“只是为了确保应用程序不会在方法中出现错误而不是性能?

3 个答案:

答案 0 :(得分:1)

仅捕获您要处理的异常。

因为最好让你的应用程序崩溃,而不是继续执行并说清除所有用户数据,或者向每个客户发送电子邮件,或者打开切割器,而某些人有头脑,或者甚至这样做远离问题发生的地方,调试它是一个母马。

有些情况下,使用try catch和swallow是合理的,但它们是例外......

答案 1 :(得分:0)

一次一个绅士请...

空检查。 是的。如果确保不返回null。所以,如果不是这样,会发生什么。

null是一个有效的论证,你做其他事情(比如什么都没有),或者不是在哪种情况下你应该抛出一个参数null异常尽可能接近问题。否则你最终会得到Spaghetti对象。

答案 2 :(得分:0)

您在asp.net应用中使用System.Drawing。除非you do absolutely everything right,否则这是一个坏主意。在多个页面事件的过程中修改它是一个特别糟糕的想法,因为如果发生异常,位图永远不会被处置(GC将Bitmap实例视为1kb对象,而实际占用20-100MB)。

WPF也容易出现类似的错误,但在崩溃之前会稍微扩展一下。基本上,如果您在asp.net应用程序中使用Bitmaps和Images等大对象,则必须手动管理内存以防止进程快速耗尽内存。

我的建议是use asp.net-safe library,或者在单独的指令队列中收集需要对位图进行的更改,并使用{}()子句在单个位置内完成所有位图处理。 / p>