Должен ли я использовать Public Shared Sub и Public Shared Functions или нет? Делятся ли они данными между пользователями?

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

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

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

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

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

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


person Jason Gerstein    schedule 13.11.2011    source источник
comment
Пожалуйста, дайте несколько примеров кода. Тот факт, что вы используете VB.NET, сбивает с толку некоторых читателей.   -  person John Saunders    schedule 14.11.2011


Ответы (3)


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

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

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

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

Изменить: В ответ на ваш вопрос...

Рассмотрим класс 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», потому что не существует фактического экземпляра класса и, следовательно, нет такой вещи, как «это».

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

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

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

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

person Brandon Moore    schedule 13.11.2011
comment
Спасибо за мысли. Это помогает мне разобраться в этом, и я перерабатываю многие из своих функций. Итак, скажем, у меня есть общедоступная общая функция, которая принимает байвал целого числа и возвращает строковое значение. Если есть только 5 доступных целых чисел, которые можно передать через веб-сайт, и ни одно из них не относится к конкретному пользователю, создаст ли это 5 разных фреймов, которые будут использоваться всеми пользователями? То есть будет ли это хорошим использованием общедоступной общей функции? - person Jason Gerstein; 13.11.2011
comment
Я не совсем понимаю, как вы имеете в виду, что у вас есть 5 доступных целых чисел... например, 5 параметров или статических переменных или что? Я добавил гораздо больше информации в свой ответ, так что проверьте это, и если он не отвечает на ваш вопрос, возможно, попробуйте предоставить немного больше информации о том, что именно вы имеете в виду. - person Brandon Moore; 14.11.2011
comment
Спасибо, я думаю, вы помогли мне разобраться! - person Jason Gerstein; 14.11.2011

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

person rerun    schedule 13.11.2011

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

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

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

person svick    schedule 13.11.2011