2012-03-19 2 views
3

У меня есть простой веб-сайт, построенный с помощью asp.net. Обычно он имеет только 1 или 2 пользователей одновременно. Мой вопрос в том, нормально ли создавать экземпляр класса на уровне класса или я должен создавать экземпляры для каждого метода. Вот пример. У меня есть класс с именем Host с полем имени и полем mac. В моем коде позади для конкретной страницы Является ли это нормально, чтобы сделать это:Являются ли приемлемыми переменные/объекты уровня класса?

public partial class addhosts : Page 
{ 
    private Host host = new Host(); 
    private HostDal dal = new HostDal(); 

    protected void myMethod() 
    { 
      host.Name = "myname" 
      host.Mac = "mymac" 
    } 

    protected void btnSubmit_Click(object sender, EventArgs e) 
    { 
      dal.AddHost(host) 
    } 
}   
+2

зависит от того, как вы хотите, чтобы он себя вел! – c0deNinja

ответ

2

Во-первых, то, что вы имеете в виду более обычно называют global против local переменных.

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

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

Here is a wikipedia article, что подтверждает мою выше пункт:

Они, как правило, считается плохой практикой именно из-за их нелокальность: глобальная переменная потенциально может быть изменен из в любом месте (если они не находятся в защищенной памяти или иным образом оказанных только для чтения), а также любая часть программы может зависеть от него

Чтобы избавиться от глобалов, вы можете сделать это (используя инициализаторы объектов)

protected void btnSubmit_Click(object sender, EventArgs e) 
{ 
     var host = new Host 
      { 
       Name = "myname", 
       Mac = "mymac" 
      }; 
     dal.AddHost(host) 
} 
+0

Спасибо, я понимаю, что это простой пример. Думаю, лучший вопрос был бы в этой плохой практике. Как еще я могу получить информацию о хосте в методе sumbit. Если я создал экземпляр внутри другого метода? – user1279156

+0

Я обновил свой ответ, чтобы ответить на ваши дальнейшие вопросы. –

+0

Если вы не возражаете, можете добавить еще один ключ. Предположим, что при загрузке страницы я прочитал в хосте из базы данных, а затем присвоил host.Name текстовому полю, пользователь может изменить имя, а затем отправить отправить хост обратно в базу данных. Используя ваше предложение, мне нужно было бы создать экземпляр или инициализировать хост 2 раз, раз в загрузке страницы и один раз в submit, это правильно ?. Кажется, что имеет смысл сделать это один раз и изменить значения по мере необходимости. Еще раз спасибо. – user1279156

0

Это совершенно нормально, так как для каждого пользователя нового класс создается (ASP.NET дизайна). Это также в отдельном потоке, поэтому даже статические переменные были бы приемлемыми в этом сценарии.

Cheers, Иван

+0

Уверены ли вы в этом? Я не собираюсь шуметь на тестовой странице, но статические переменные доступны между разными потоками, и в целом я бы ожидал, что если вы сохранили somethign в статической переменной, которую мог бы забрать другой сеанс ... – Chris

+0

Нет где icesars или OP говорят, что переменная была статичной! Статические переменные являются другим зверем и сохраняются во всем пуле приложений. В примере OPs каждый раз, когда запрос приходит на страницу addhost, создается новый экземпляр этого класса. Переменные находятся на уровне класса, и поэтому каждый запрос пользователя имеет свой собственный экземпляр. –

+0

«так что даже статические переменные были бы приемлемыми в этом сценарии» - icesar. Эта линия неверна. – Servy

1

Это не имеет значения.

Каждый запрос на вашу страницу является отдельным и не знает других запросов, поэтому нет никаких шансов на «конфликт» с другими запросами.

1

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

Смежные вопросы