2012-05-23 92 views
3

非靜態類相對靜態類有什麼優勢?非靜態類相對靜態類有什麼優勢?

靜態類不需要實例化。所以我們可以直接使用ClassName.MemberName,那麼什麼是非靜態類

+2

您也可以直接使用'ClassName.MemberName'如果'MemberName'是靜態的,但該類不是。當你不(並且永遠不會)創建它的實例時,使類成爲靜態的。這是擴展類的必備條件。 –

+1

那麼只有一個MemberName?使用靜態類如何實現'人'? –

+1

從http://stackoverflow.com/questions/576853/what-is-the-use-of-a-static-class開始 – V4Vendetta

回答

1

靜態類與非靜態類基本相同,但有一點不同:靜態類不能實例化。換句話說,您不能使用new關鍵字來創建類類型的變量。因爲沒有實例變量,您使用類名稱本身

靜態類只有一個類本身的實例,所以你不能創建一個靜態類的多個實例訪問靜態類的成員。

看着你的問題,你不能同時設置兩個不同的值下面的屬性,如果類是靜態的,因爲只會有一個ClassName內存

ClassName.MemberName 

更多信息以

http://msdn.microsoft.com/en-us/library/79b3xss3.aspx

實例
0

非靜態類的優點是靜態類是可怕的單元測試 - 他們不能輕易被嘲笑,他們不支持接口。

2

說你需要存儲的信息和操作encapsulate僱員。

class Employee 
{ 
    string Name {get; set;} 
    double HourlyRate {get; set;} 
    double CalculatePay(int hoursWorked) { . . . } 
} 

現在,讓我們說您的程序需要同時比較兩個員工嗎?

正是!使用非靜態員工類,您可以實例化Employee類的兩個(或更多)instances,這些objects中的每一個代表不同的Employee。

你不能這樣做員工是靜態的。

例如

void CompareEmployees(Employee empA, Employee empB) 
{ 
    if(empA.HourlyRate < empB.HourlyRate) 
     Console.WriteLine("Employee {0} has a higher rate than {1}", empA.Name, empB.Name); 

    else if(empA.HourlyRate > empB.HourlyRate) 
     Console.WriteLine("Employee {0} has a higher rate {1}", empb.Name, empA.Name); 
    else 
     Console.WriteLine("{0} and {1} have the same rate", empb.Name, empA.Name); 
} 
1

認爲一個類爲類(對象)的建築藍圖和實例爲依據的藍本設計建造的建築。

給定一個藍圖,你可以創建許多建築物。這些建築物中的每一個都有相同的結構,但每個都是獨立的 - 一個門可以打開,另一個門關閉。

靜態類就像是永遠不能用來建造房屋的任何一個藍圖。你仍然可以做一些事情,比如把它撕掉或者灑上咖啡,但是你不可能在藍圖上打開門,因爲它沒有真正的門,只有門的設計。

描述這種情況的另一種方法是考慮'狀態'。建築物(物體)具有某種狀態(例如,門是否打開),並且每個建築物的狀態可以不同(例如,它是否是自己的門是打開的)。藍圖(課程)也可以具有(靜態)狀態(例如,咖啡是否灑落在其上),但與根據藍圖建造的建築物相關的狀態不同並且分開。

public class House { 
    private static boolean isCoffeeSpilt; 

    private boolean isDoorOpen; 

    public static void spillCoffee() { 
     House.isCoffeeSpilt = true; 
    } 

    public void openDoor() { 
     isDoorOpen = true; 
    } 
} 

public static class Program { 
    public static void main(String[] args) { 
     House redHouse = new House(); // 1 
     House blueHouse = new House(); // 2 

     redHouse.openDoor();   // 3 

     House.spillCoffee();   // 4 
    } 
} 

在上面的例子中,線1,2,和3將是不可能的,如果是House一個靜態類。請注意,在House的實例上調用openDoor,而在該類本身上調用spillCoffee。還要注意的是,在第4行,紅房子的門打開了,但藍房子的門仍然關着。

0

靜態類不能被實例化(在技術上它是,但只有一次),靜態構造函數是「一般」的首次訪問類,它可以是很難跟蹤和協調調用。 如果你想要一個只收集一些實用方法的類,靜態類很好。 .net框架中的數學就是一個很好的例子。它們對於extension methods也是有用的。除此之外,我不使用它們。

如果你需要一個實例,並且不希望被綁定到一個靜態類有限制,單例模式是非常有用的。關於單例和靜態類之間的區別的一個nice article

當然,非靜態類必須實例化,存儲在一個變量中,並且可以多次實例化。

例子:

靜態類,用於加載文件只是輔助方法:

static class TextureHelper 
{ 
    public static byte[] LoadFromFile(string aFileName); 
} 

一個Singleton是主要的點來創建紋理。

public sealed class TextureManager 
{ 
    public static TextureManager Instance{get;set;} 

    public Texture CreateTexture(); 
} 

一個實際的紋理,我可能在我的應用程序中有很多。

public class Texture 
{ 

}