C# 静态方法,GDI+;,处理琐碎问题的异常

C# 静态方法,GDI+;,处理琐碎问题的异常,c#,asp.net,exception-handling,null,gdi+,C#,Asp.net,Exception Handling,Null,Gdi+,在使用WinForms一段时间后,我开始编写ASP.NET web应用程序。经过几次尝试错误后,我终于意识到这两个问题有多大的不同。虽然我知道很多关于C的高级知识,但在学习一些更难的知识之前,我从来没有学过我应该学的琐碎知识,所以我在这里提问,因为有些问题不能通过教程来回答,而是通过开发人员的经验,所以我将开始: 在GDI+中处理图形时,哪种方法正确 Bitmap bitmap; Graphics g; protected void Page_Load(object sender, Event

在使用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..
}
关于静态方法:

我有很多方法不适合任何实例类,比如我在应用程序的不同部分需要的一些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,那么检查对象是否为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;
List List=新列表();
//只有当我们调用某个返回null的方法或我们这样做时,列表才能变为null
列表=空;
关于异常处理: 我读过一些类似“不要捕捉你无法处理的异常”的文章,这是什么意思


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

请一次一个

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


null是有效的参数,您可以执行其他操作(例如nothing),或者不是,在这种情况下,您应该抛出一个尽可能接近问题的参数null异常。否则,您将得到意大利面对象。

您将要处理的只有陷阱异常

因为让你的应用程序崩溃比继续执行并说清除所有用户数据、给每个客户发送电子邮件、在某个家伙把头埋在下面的时候打开切割器、甚至远离问题发生的地方要好得多,调试它是一件苦差事


在某些情况下,使用try-catch和swallow是合理的,但它们是例外…

您正在asp.net应用程序中使用System.Drawing。那是个坏主意,除非。在多个页面事件的过程中修改它是一个特别糟糕的主意,因为如果发生异常,位图永远不会被处理(GC将位图实例视为1kb对象,而实际上它占用了20-100MB)

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


我的建议是,或者在单独的指令队列中收集需要随时间对位图所做的更改,并在单个using{}()子句中完成所有位图处理。

Hi!你能把你的问题分成3个不同的问题吗?@rodrigovedovato我到现在还没有时间检查答案,我猜没有必要再分开了,对不起。你的观点真的很好。这个库真的很好,但我需要实际的绘图,而不仅仅是图像转换。最好的办法是在一个using{}()子句中处理位图,这在我看来是最无痛的。谢谢你的澄清,我真的没有在我的应用程序中滥用Try-Catch,只是为了将来参考。这个问题有很多正确答案,但只有一个错误,吞下一个你没有可靠的方法来处理的东西,它会发生在最尴尬的时候,当你最不能应付的时候,让你在每个人和他的狗面前看起来像个无能的人(