2010-10-21 5 views
3

Я работаю с Asp.NET, и у меня есть класс с именем PathFinder, который имеет методы вроде StyleBarPath(string BrandId,string ProductId), который возвращает, например, комбинацию пути, включая brandId и productId, а также есть такие методы в одном классе.Статический метод Confusion

То, что я думаю, чтобы сделать их static методов, чтобы вызвать их легко в каждом месте, говоря PathFinder.StylePath("1","2");, чтобы использовать возвращаемые значения внутри пользовательского элемента управления <a href=""></a>.

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

Поскольку я использую встроенное кодирование во многих местах, например <a href='<%=PathFinder.StylePath("1","2")%>'></a>, я не хочу создавать множество экземпляров, делая это <a href='<%=new PathFinder().StylePath("1","2")%>'></a>, объявляя методы нестатическими.

Но я боюсь изменить методы, возвращает значения, потому что определяет методы static. Я имею в виду, когда клиент вызывает этот метод, это не повлияет на других клиентов, которые одновременно ссылаются на один и тот же метод?

У них бы были разные стеки вызовов?

Позволяет сказать:

  • клиент один вызывает метод с этими параметрами - {brandId:2,productId:3}
  • клиент буксировка вызывает метод с этими параметрами - {brandId:3,productId:4}

Эти действия происходит вблизи того же когда сервер обрабатывает свои запросы. Что я хочу узнать о том, влияют ли вызовы друг на друга и изменяют возвращаемые значения друг друга, так как они определены как статические.

Спасибо за чтение до сих пор и будучи помощником :)

Я просто не хочу, чтобы клиенты видят path/1/2/ в то время как они ждут path/2/3/

Некоторые замечания по поводу вопроса:

  • Это то же самое для статических полей?
+1

Статические поля будут распределены, статические методы были бы не – jcolebrand

ответ

7

Вы можете вызвать статический метод безопасно из нескольких потоков одновременно и в разное время, учитывая следующее:

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

Если ваш метод является таким, каким он выглядит, вы просто принимаете некоторые входы, настраивая их и возвращая результат без доступа к чему-либо вне функции. Это было бы совершенно безопасно.

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

+0

еще один вопрос: Статические переменные распределяются по всему домену домена приложения? Поэтому они должны быть потокобезопасными, если я хочу работать со статическими переменными и полями? Поскольку все запросы подаются в одном домене приложения с разными потоками, они не будут потокобезопасными. – Tarik

+0

@Braveyard: Похоже, вы правильно это поняли. Записываемые статические свойства и переменные не являются потокобезопасными, если только вы не переходите к дополнительной работе, чтобы сделать их такими. –

1

В C#, статические средства (в терминах непрофессионала) есть одна копия. Если вы предоставите аргументы методу и вы вернете значение только на основе этих параметров, тогда вы будете совершенно в безопасности.

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

Из примера, который вы указали, вы в безопасности.

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

+0

Хорошо, что я пытаюсь понять из вашего утверждения, где статические переменные являются одной копией? Для всех клиентов в домене приложений или только один сеанс? – Tarik

+0

Static предназначен для пула приложений для сервера, поэтому все пользователи веб-сервера будут видеть одинаковое значение. Обратите внимание: если вы используете свое приложение в веб-ферме, пользователи МОГУТ видеть разные версии, так как каждый запрос может обслуживаться с другого сервера/фермы ... Рекомендуется тщательное кодирование (постоянство базы данных) ... – Dekker500

+0

Are вы уверены в пуле приложений? Поскольку пул приложений может содержать много AppDomains, поэтому в соответствии с вашим заявлением статическое поле может быть разделено между всеми AppDomains, которое противоречит политике изоляции AppDomains. – Tarik

1

Это должно ответить на большинство из вас расспрашивает http://odetocode.com/Articles/313.aspx

Как я понимаю, статические методы поточно, но не статические свойства

+0

Мне всегда нравятся статьи на этом сайте. Спасибо, что поделились ею. – Tarik

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