2013-06-26 66 views
6

我可能沒有清楚地解釋這一點。但是在部分類內部與在每個方法內部創建類的缺點是什麼? (請參見實施例)在ASP.NET中部分或在方法內實例化C#類

實施例內部部分:

public partial class test: System.Web.UI.Page 
{ 

cSystem oSystem = new cSystem(); 

protected void Page_Load(object sender, EventArgs e) 
    { 
    oSystem.useme(); 
} 
protected void btnSubmit_Click(object sender, EventArgs e) 
    { 
    oSystem.usethis(); 
} 

實施例的每個類中:

public partial class test: System.Web.UI.Page 
{ 


protected void Page_Load(object sender, EventArgs e) 
    { 
    cSystem oSystem = new cSystem(); 
    oSystem.useme(); 
} 
protected void btnSubmit_Click(object sender, EventArgs e) 
    { 
    cSystem oSystem = new cSystem(); 
    oSystem.usethis(); 
} 
+1

如果你的班級和成員似乎是靜態的,爲什麼還要實例化 – Pleun

+0

不,它不是靜態的。 cSystem是一個實用程序類。我遠離以前發佈的web應用程序的靜態類。 – user2156940

+0

我也使用cSystem作爲我的控制器之一,並且.cs頁面使用它們:using {myapp} .Controllers; namespace {myapp} .Controllers { public class cSystem { – user2156940

回答

1

一旦場景,其中每個方法產生一個新的實例將一個問題是否需要保持方法範圍之外的對象狀態。在這種情況下,每個方法的實例都是錯誤的,但我認爲這不適用於您。

其他可能重要的考慮因素是該特定對象是否重創或不重要。

在大多數情況下,從性能角度來看,它只是一個品味問題,它通常沒有區別。

如果您多次創建相同的實例並且可以對單個和全局實例執行相同的工作,那麼第一種情況可能更合適。只是爲了避免重複相同的實例化行。

2

在大多數頁面中,實際上不會有那麼大的差異。

第一個示例將在創建Page時創建該實例。 oSystem將可用於整個頁面的整個生命週期。

第二個示例將在Page_Load事件中創建實例,該事件直到大致頁面生命週期的中間纔會發生。

有關頁面生命週期的更多信息,請參閱ASP.NET Page Life Cycle Overview

如果您想在前面的例子中使用該實例,例如在Page_Init事件中,則前一個示例不會提前分配該對象。

如果您的應用程序需要高性能,需要非常高效的內存管理,您可能會更喜歡後者的示例。這個例子會將內存更接近它正在使用的時間,因此它不會將資源捆綁到比需要更長的時間。也就是說,如果你想要有效的內存管理,你可以做很多優化。

因此,在大多數頁面中,沒有實際的區別。

+0

良好的信息,我想到性能,你說什麼是有道理的。我把它看作是在頁面上的許多方法中使用它,如果我這樣做了,它會被更好地管理,但是在每個方法中創建它可能更好,這樣它就可以更好地管理(我假設GC是將這些清理乾淨的最佳方法?)。 – user2156940

+0

關於GC,是的。 .NET有一個偉大的GC。事實上,我認爲解決GC是非常困難的。我甚至不知道如何去做,除了使用COM對象或類似的東西。 – Jeff

1
  • 在第一種情況下,對於 請求,只會創建一次類cSystem。
  • 在第二種情況下,當您單擊提交按鈕時,類cSystem將創建兩次,其中一個在Page_Load方法中,另一個在btnSubmit_Click方法中。