создание объектов в качестве атрибута против создания объектов в большинстве методов - PullRequest
0 голосов
/ 15 октября 2018

Используя веб-формы C # и включенные примеры кода, каков будет правильный путь, или минусы / плюсы для создания экземпляров объектов для программы в качестве атрибутов класса (вариант 1)?Или в каждом методе будет использоваться объект / ы (вариант 2)?Примите во внимание, что существует намного больше методов и объектов, и хотя большинство методов будут использовать объекты, есть несколько методов, которые не будут.

Обновления:

  • Имена переменных задаются таким образом только в качестве примера.
  • Вопрос больше о любых плюсах / минусах в отношении производительности / обслуживания / читаемости / дублирования кода?

Вариант 1:

public partial class MyPage : MyBasePage
{
    //Declared as an attribute and instantiated at init
    private MyClass MC;

    protected void Page_Init(object sender, EventArgs e)
    {
        MC = new MyClass();
        DoSomeStuff();
        DoMoreStuff();
        DoSomethingElse();
    }

    private void DoSomeStuff()
    {
        // Do stuff with MC
    }

    private void DoMoreStuff()
    {
        //Do more stuff MC
    }

    private void DoSomethingElse()
    {
        //Do some stuff WITHOUT MC
    }
}

Вариант 2:

public partial class MyPage : MyBasePage
{
    protected void Page_Init(object sender, EventArgs e)
    {        
        DoSomeStuff();
        DoMoreStuff();
        DoSomethingElse();
    }

    private void DoSomeStuff()
    {
        //Declared and instantiated on every method that needs it
        MyClass MC = new MyClass();
        // Do stuff with MC
    }

    private void DoMoreStuff()
    {
        //Declared and instantiated on every method that needs it
        MyClass MC = new MyClass();
        //Do some stuff with MC
    }

    private void DoSomethingElse()
    {
        //Do some stuff WITHOUT MC
    }
}

Обновление: Как насчет этого третьего варианта, предоставленного Шам

private MyClass _MC;
private MyClass MC
{
    get
    {
        if(_MC == null)
        {
            _MC = new MyClass();
        }
        return _MC;
    }
}

Ответы [ 2 ]

0 голосов
/ 15 октября 2018

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

В Варианте 2 вы делаете:

private void DoMoreStuff()
{
    //Declared and instantiated on every method that needs it
    MyClass MC MC = new MyClass();
    //Do some stuff with MC
}

Это означает, что MC доступен только ВНУТРИ DoMoreStuff.Если вы создадите еще один MC MC в MyClass (не очень хорошее название) внутри другого метода, то это будет совершенно другой экземпляр MC и не будет иметь ничего общего с первым.

Если, однако, вы используете Вариант 1,каждый метод может получить к нему доступ, но каждый также может его изменить.Поэтому, если у MC есть свойство с именем 'Age', которое является целым числом, и один метод устанавливает его равным 23, а затем другой метод проверяет, должно ли это свойство быть 23. Другой метод может прийти позже и обновить это свойство и установить его равным 64 и т. Д.Однако это может быть полезно для таких вещей, как сервисы, которые предлагают общие методы работы.

Таким образом, это действительно зависит от того, что MC должен делать и как он будет использоваться.Предоставляет ли он какую-то услугу вашей MyPage, к которой вы хотите, чтобы различные методы могли иметь доступ, например, к журналам, или это просто что-то, что хранит данные, например, класс людей с такими вещами, как имя, возраст, рост и т. Д.?

0 голосов
/ 15 октября 2018

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

Я предполагаю, что у вас есть надлежащее соглашение об именах в вашем производственном коде.

    private MyClass _MC;
    private MyClass MC
    {
        get
        {
            if(_MC == null)
            {
                _MC = new MyClass();
            }
            return _MC;
        }
    }
...