Должен ли я использовать общедоступный вспомогательный модуль и общедоступные общие функции или нет? Обмениваются ли они данными между пользователями?

#.net #vb.net #function #shared #public

#.net #vb.net #функция #общие #общедоступные

Вопрос:

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

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

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

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

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

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

Комментарии:

1. Пожалуйста, приведите несколько примеров кода. Тот факт, что вы используете VB.NET это сбивает с толку некоторых читателей.

Ответ №1:

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

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

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

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

Редактировать: Возвращаясь к вашему вопросу…

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

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

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

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

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

Комментарии:

1. Спасибо за мысли. Это помогает мне разобраться в этом, и я перерабатываю многие свои функции. Хорошо, допустим, у меня есть общедоступная общая функция, которая принимает значение byval целого числа и возвращает строковое значение. Если есть только 5 доступных целых чисел, которые можно передавать по всему веб-сайту, и ни одно из них не зависит от пользователя, создаст ли это 5 разных фреймов, которые будут использоваться совместно пользователями? Т.е. будет ли это хорошим использованием общедоступной общей функции?

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

3. Спасибо, я думаю, вы помогли мне прояснить это!

Ответ №2:

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

Ответ №3:

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

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

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