Если бы вы могли выбрать только один, повторение было бы правильным. Но есть причина, по которой совместное использование существует, и лучше понять ее, чтобы использовать ее надлежащим образом.
Допустим, у вас есть функция, которая просто возвращает все записи в базе данных, тогда ее можно было бы поместить в общий класс. Допустим, у этой функции есть параметр, который позволяет вам указать одну запись, которую вы хотите вернуть. В этом случае вы по-прежнему в безопасности, потому что каждый вызов функции будет добавлять в стек еще один кадр и отдельно отслеживать переменные для этого кадра.
Однако, если вы начнете работать с переменной-членом класса внутри своей функции, то у вас могут возникнуть проблемы. Допустим, ваш класс использует переменную-член, которая содержит количество отображаемых строк на странице. Каждый раз, когда пользователь меняет свои предпочтения, это влияет на всех пользователей.
Итак, я надеюсь, что это немного прояснило для вас.
Изменить: В ответ на ваш вопрос...
Рассмотрим класс 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