2012-02-16 54 views
0

我在使用WinForms一段時間後開始編寫ASP.NET Web應用程序。經過幾次嘗試錯誤的錯誤,我終於意識到這兩者有什麼不同。儘管我知道很多關於C#的高級內容,但我從未學會在推進一些更困難的事情之前應該知道的小事,所以我在這裏問這些問題,可能會遇到一些問題不會回答低谷的教程,而是開發者的體驗,所以我會開始:靜態方法,GDI +,異常處理瑣碎問題

在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 

在靜態方法中定義localy的變量是否共享此行爲? 使用靜態方法有沒有像這樣的危險?

關於空: 難道真的nessecery檢查對象爲空,如果你確保你對可空類型變量的使用方法不返回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語句「只是爲了確保該應用程序不chrash」裏面的方法不對其他然後表現?

+0

嗨!你能把你的問題分成3個不同的問題嗎? – 2012-02-16 11:21:21

+0

@rodrigovedovato我沒有時間去檢查答案,現在猜測沒有意義再分裂,對不起。 – formatc 2012-02-17 12:41:40

回答

1

只有捕獲異常你要處理。

因爲最好是讓應用程序崩潰,而不是繼續執行並說出所有的用戶數據,或者發送一封電子郵件給每個客戶,或者打開切割機,而某些傢伙的頭下有它,甚至可以獲得遠離問題發生的地方,調試它是一個母馬。

存在這樣的情況,它是合理使用嘗試捕捉和吞嚥,但它們是例外...

+0

謝謝你的澄清,我真的不會濫用嘗試抓住我的應用程序,但僅供將來參考。 – formatc 2012-02-17 12:47:17

+0

這個區域有很多權利的答案,但只有一個錯誤的,吞下你沒有可信的處理方式,它會發生在最尷尬的時候,當你最不能應付,讓你看起來像是每個人和他的狗的無能。 :( – 2012-02-18 22:46:53

0

一次一個紳士請...

空檢查。 是的。如果你確定null沒有被返回。所以如果情況並非如此,會發生什麼。

要麼null是一個有效的argumement和你做其他的財產以後(如無),或者它是不是在這種情況下,你應該拋出一個論點空異常接近的問題成爲可能。否則,你會得到Spaghetti物體。

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,或者在一個單獨的指令隊列中隨時間收集需要對位圖進行的更改,並使用{}()子句在一個單獨的位置處理所有位圖處理。

+0

真的很好的一點,你做的。這個庫是非常好的,但我需要實際繪製不只是圖像轉換。最好的想法是在一個使用{}()子句處理位圖,這將是最無痛的IMO。 – formatc 2012-02-17 12:44:58