Должен ли я использовать Public Shared Sub и Public Shared Functions или нет?Они делятся данными между пользователями? - PullRequest
1 голос
/ 13 ноября 2011

Я работаю с .Net, используя VB, и только что закончил проект веб-сайта, и я собираюсь развернуть его ... но, проходя окончательную очистку / пошаговое руководство, я заметил, что в настоящее время у меня естьиспользовал Public Shared Function 62 раза и Public Shared Sub 14 раз, а также пару общедоступных общих свойств.

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

Многие статьи, которые я прочитал, указывают на то, что Public Shared просто облегчает доступ к функции или подпрограмме, не создавая ее сначала.

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

Это то, где я не уверен / растерян.Если 2 пользователя включены одновременно, и они оба вызывают одну и ту же Общедоступную функцию или Sub, могут ли вещи пересекаться?

Переменные / свойства работают одинаково или по-разному?Например, если я сохраняю объект пользователя в качестве общего общего свойства, это ограничено только этим пользователем, или все пользователи смогут получить к нему доступ?

Ответы [ 3 ]

4 голосов
/ 13 ноября 2011

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

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

Однако, если вы начнете работать с переменной-членом класса в вашей функции, тогда вы можете столкнуться с проблемами.Допустим, ваш класс использует переменную-член, которая содержит количество строк на странице для отображения.Каждый раз, когда пользователь меняет свои предпочтения, это влияет на всех пользователей.

Итак, я надеюсь, что это немного прояснит для вас.

Редактировать: В ответ на ваш вопрос ...

Рассмотрим класс MessageBox.Как вы знаете, вам не нужно создавать его экземпляр, чтобы использовать его методы.И если к его методу Show (string text) одновременно делается два вызова, вам не нужно беспокоиться о том, что второй вызов перезаписывает сообщение, переданное первым, потому что каждый вызов метода поддерживает свой собственный набор переменных.

Однако рассмотрим следующий класс:

public static class MyMessageBox
{
    public static string Message { get; set; }

    public static void Show() 
    {
        MessageBox.Show(MyMessageBox.Message);
    }
}

Обратите внимание на несколько вещей об этом классе: 1) Show должен получить доступ к свойству Message через ссылку на статический класс MyMessageBox.Он не может ссылаться на него как «this.Message», потому что нет фактического экземпляра класса и, следовательно, нет такого понятия, как «this».

2) Поскольку это статический класс, все свойства / полядолжен быть объявлен как статический.Однако не поймите неправильно, что у вас также может быть нестатический класс со статическими переменными и методами.С функциональной точки зрения, статический класс не меняет черты поведения вашего кода ... он лишь заставляет компилятор применять определенные правила в вашем классе.

Создание статического метода позволяет вам вызывать его как MyClass.SomeMethod () вместо instanceOfMyClass.SomeMethod ().Это только разница в синтаксисе.В действительности все методы всегда статичны (т. Е. Никогда не бывает нескольких экземпляров кода вашего метода ... он находится только в одном месте. Это переменные, которые создаются).В дополнение к разнице в синтаксисе создание статического метода также обеспечивает соблюдение правил, не позволяющих вам ссылаться на любые нестатические свойства / поля, что имеет смысл, поскольку вы не вызываете его из фактического экземпляра вашего объекта.

3) Самое главное, обратите внимание, что это был бы ужасный способ создать этот класс.Если к классу сделано два вызова, возможно, что один человек может установить для свойства Message значение «Hello», а кто-то другой может установить для него значение «World», прежде чем первый человек отобразит свое сообщение.Затем каждый человек вызывает метод Show (), и вы получаете два окна сообщения с надписью «Мир».

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

1 голос
/ 13 ноября 2011

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

0 голосов
/ 13 ноября 2011

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

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

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

...