2013-07-12 47 views
0

我遇到以下代碼。創建實例時的static關鍵字

public class Test 
{ 
    public static Test Create() 
    { 
    return new Test 
    { 
    a1 =1, 
    b1="abc"  

    }; 
    } 
    : 
    : 
    : 
} 

而在調用的類進行實例如下

static Test model = Test.Create(); 

什麼是在上述行使用static關鍵字?如果我們不使用關鍵字static,會有什麼區別?我使用.NET 4.0和VS 2010

編輯

我知道什麼是用C#static。我問這個問題的主要原因是爲什麼在創建類的實例時使用它?

+7

請參閱http://msdn.microsoft.com/en-us/library/98f28cdx.aspx - 或者閱讀您正在學習C#的任何書籍/教程中的靜態字段。 –

+0

在這裏你去:http://msdn.microsoft.com/en-us/library/79b3xss3(v=vs.80).aspx – LokiSinclair

+0

看到我的答案在這可能的選擇... – Tigran

回答

4

在這具體提出的代碼,看不到使用這種技術很多sence,但通常你可以做到這一點,以控制你的類型實例創建。

例如:你的類與客戶端的某個COM對象進行交互的圖像,不能被實例化10次以上。要控制API的消費者不會創建超過10個類型的實例,可以使用這種技術。

public class MyComWrapper { 
    private MyComWrapper() {} // MAKE CTOR PRIVATE SO NOONE CAN CREATE 
           // AN INSTANCE OF YOUR CLASS IF NOT WITH 
           // `static` METHOD CALL 

    static int counter = 0;   //INSTANCE COUNTER 
    public static MyComWrapper Create() 
    { 
    if(counter >10)  //MORE THEN 10, BAD ! 
     throw new InvalidOperationException("Can not instantiate more then 10 instances"); 

    counter ++; 
    return new Test 
    { 
    a1 =1, 
    b1="abc"  

    }; 
    } 
} 
+0

你會在這裏找到具體的例子http://bradwilson.typepad.com/blog/2009/10/aspnet-mvc-2-templates-part-4-custom-object-templates.html –

+0

@gmailuser:* probabbly *這裏要指出的是,通過使用他的靜態方法,您可以獲得具有預定義值的所有必需屬性字段的該類的實例。如果你不喜歡這個默認值,或者你想要不同的啓動配置,只需使用普通的實例創建方法,並用適當的*值填充屬性。 – Tigran

+0

@gmailuser:看起來這只是一種創建具有合理值的示例的實例。也許該方法應該被命名爲'CreateExampleInstance'。 –

3

靜態關鍵字使其可用而無需實例化對象。作者正在創建一個函數來以特定方式實例化對象,但由於它是默認構造函數,所以任何人都可以實例化它。

雖然不是唯一的,但隨着構造函數的私有化,這是Singleton Pattern中常用的模式。

+0

你怎麼知道構造函數是私有的? – musefan

0

Static修飾符屬於類型本身,而不屬於特定的對象。

您不必創建實例即可使用static函數。您可以直接使用static函數而不創建該類的實例。

如果將static關鍵字應用於類,則該類的所有成員都必須是靜態的。

0

很簡單。它們是static的單獨用途。第一個在非靜態類中創建一個靜態方法。第二個創建「調用」類的靜態成員。

你的Test類本身不是靜態的,所以你可以實例化它。

要回答你的問題:如果你不在調用類中使用static關鍵字,它將是一個「普通」實例成員。