2015-09-06 2 views
-3

В чем разница между этими кодами
1.Лучшее место для создания нового экземпляра класса в C#

Public class class1() 
{ ... } 

Public class Main() 
{ 
    public void method() 
    { 
     class1 k = new class1;  <--- 
     ... 
    } 
} 

2.

Public class class1() 
{ ... } 

Public class Main() 
{ 
    class1 k = new class1;  <--- 

    public void method() 
    { 
     k.use(); 
     ... 
    } 
} 

Где лучше создать экземпляр класса, в корне второго класса или в каждом методе и функции, которым нужен класс1?

+1

Это будет зависеть от того, насколько оно вам понадобится после выхода из метода. –

+0

Существует одна общая черта: ни один код не был бы скомпилирован – dotnetom

+2

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

ответ

1

Я бы сказал, что это зависит от того, как вы собираетесь использовать объект.

Является ли он ресурсом, который необходимо создать и утилизировать каждый раз, когда вы его используете (думая о подключении db)? Тогда создание экземпляра в методе является самым безопасным способом.

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

0

Лучший способ не создавать новый экземпляр в вашем коде, а использовать инъекцию зависимостей. Лучше всего использовать какой-либо интерфейс или абстрактный класс. Таким образом, вы не полагаетесь на конкретную реализацию, и ваш код более подвержен проверке, потому что вы можете контролировать, что такое passedThroughConstructor. При написании кода для класса SomeOne вам все равно, где создается SomeTwo, вы показываете, что ваш SomeOne зависит от него и не может быть создан без него.

public class SomeOne{ 

ISomeTwo _forInternalUse; 
    public SomeOne(ISomeTwo passedThroughConstructor){ 
    _forInternalUse = passedThroughConstructor; 
    } 

    public void SomeOtherMethod(){ 
     _forInternalUse.DoStuff(); 
    } 
}