簡體   English   中英

具有靜態方法的C#類實例與靜態類內存使用情況

[英]C# class instance with static method vs static class memory usage

在這兩種情況之間,C#或其他語言如何處理內存分配(和內存解除分配):

1.)調用靜態類的方法。

public Program {
    Foo foo = Loader.load();
}

public static Loader {
    public static Foo load() {
        return new Foo();
    }
}

2.)在一個實例上調用一個方法,然后該方法超出范圍。

public Program {
    Foo foo = new Loader().load();
}

public Loader {
    public Foo load() {
        return new Foo();
    }
}

我想靜態類在內存中被加載並保留; 而C#的閑暇時,類實例屈服於垃圾收集。 這兩種范式是否有任何利弊? 有沒有時間你有一個永遠不需要實例化的類(即某種資源加載器或工廠),但你還是使用第二種方法來利用垃圾收集?

我的問題的重要部分是,第一范式是否在某些情況下在概念上是正確的,可能會遭受不必要的記憶。

你的第二個例子不起作用,所以讓我們探索真正的選擇:

1.)調用靜態類的方法。

public Program {
   Foo foo = Loader.Load();
}

public static Loader {
   public static Foo Load() {
      return new Foo();
   }
}

2.)調用非靜態類中的靜態方法。

public Program {
   Foo foo = Loader.Load();
}

public Loader {
   public static Foo Load() {
      return new Foo();
   }
}

3.)在實例上調用實例方法

public Program {
   Foo foo = new Loader().Load();
}

public Loader {
   public Foo Load() {
      return new Foo();
   }
}

兩者首先是相同的。 無論該類是否為靜態,調用靜態方法都是相同的。

第三個選項將在堆上創建類的實例。 由於該類沒有數據成員,因此它只有16個字節。 它最終將被垃圾收集,但由於體積小,發生這種情況時並不重要。

調用實例方法與靜態方法略有不同。 將發送對類實例的引用,您可以通過this關鍵字進行訪問。 在這種情況下幾乎沒有區別,因為要訪問的對象中沒有真實數據。

即使沒有創建類的實例,靜態方法,字段,屬性或事件也可在類上調用。

http://msdn.microsoft.com/en-us/library/79b3xss3(VS.80).aspx

因此,從這個意義上講,靜態方法的行為與在類實例中使用它時的行為一樣:它的作用域是類型。

第二種形式創建一個臨時的Loader對象(非常便宜)。 無論您選擇哪種方法,您都必須加載Loader類。

這里獲得的性能(內存節省)非常少。 如果在本地變量方法之外不需要“狀態”,則通常會選擇靜態類中的靜態成員。

我找不到任何這方面的資源,但是根據我的編程知識,當你引用一個類(非靜態)時,它的結構被加載到內存中

創建類的實例只是為了調用方法,會浪費大量的處理能力(由於創建實例,分配內存和垃圾收集)。

不是保留定義,而是保持定義,而不是保持定義。 為什么不保持定義(靜態)。

只要您不在靜態變量中存儲任何數據,靜態方法就應該占用與非靜態方法定義相同的內存量。 但是使用靜態方法時,只有方法將保留在內存中,並且隨時可以在不創建實例的情況下調用。 其中,如果方法是非靜態的,則需要實例化(使用內存和處理能力)並收集垃圾(釋放內存並使用cpu),因此使用靜態成員肯定更好。 那就是他們在那里。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM