2013-07-12 2 views
0

Я натолкнулся на следующий код.статическое ключевое слово при создании экземпляра

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

    }; 
    } 
    : 
    : 
    : 
} 

И в классе вызывающего его экземпляра, как показано ниже

static Test model = Test.Create(); 

Что такое использование static ключевого слова в строке выше? Какая разница, если мы не используем ключевое слово static? Я использую .NET 4 и VS 2010

EDIT

Я знаю, что в 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

В этом конкретном представлен код, не вижу большого смысла в использовании этой техники, но обычно вы можете сделать это, чтобы управлять созданием экземпляров типов.

Например: immagine, что ваш класс взаимодействует с некоторым 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 * Дело в том, что, используя свой статический метод, вы получаете экземпляр этого класса с уже всем необходимым полем свойств с предопределенным значением. Если вам не нравятся эти значения defaul или вы хотите различную конфигурацию запуска, просто используйте обычный способ создания экземпляра и заполните свойства с соответствующими значениями * для вас *. – Tigran

+0

@gmailuser: похоже, что это всего лишь способ создать экземпляр с некоторыми разумными значениями для демонстрации. Возможно, этот метод должен был бы быть назван 'CreateExampleInstance'. –

3

Статическое ключевое слово делает его доступным без создания экземпляра объекта. Автор создает функцию для создания экземпляра объекта определенным образом, но поскольку он является конструктором по умолчанию, любой может его создать.

Хотя не исключительно, наряду с созданием частного конструктора, это шаблон, обычно используемый в Singleton Pattern.

+0

Как вы можете сказать, что конструктор является приватным? – musefan

0

Static модификатор относится к самому типу, а не к определенному объекту.

Вам не нужно создавать экземпляр для использования функции static. вы можете напрямую использовать функцию static без создания экземпляра класса.

Если статическое ключевое слово применяется к классу, все члены класса должны быть статическими.

0

Это просто. Они используются отдельно от static. Первый создает статический метод в нестационарном классе. Второй создает статический член класса «вызов».

Сам класс Test не является статическим, поэтому вам разрешено его создавать.

Чтобы ответить на ваш вопрос: если вы не используете ключевое слово static в вызывающем классе, он будет «нормальным» членом экземпляра.