Почему не все поля / свойства / методы общедоступны?
Я знаю, это может звучать глупо, но я действительно хочу знать:), я учусь на C# в настоящее время,
и, как вы знаете, вам нужно установить "объект"(кнопка, метка, текст, переменная и т. д.) публичным или как вам угодно.
Тем не менее, вам все равно нужно написать код, подобный этому:
// my point is you cant just type label1.text you need to type class.label1.text
// so there is no chance of getting bugged
//because there is label1 in each of forms/classes
class Classlol = new class();
classlol.label1.blabla
Так какой смысл делать его недоступным в других формах? почему каждая вещь не является публичной или не публичной по умолчанию?
Благодарю.
4 ответа
Смысл использования классов в том, чтобы иметь возможность разделить ваш код на логически связанные части. Это облегчает понимание и поддержку вашего кода.
Например, если вам нужно изменить код в классе, вы можете сосредоточиться больше на том, как функционирует класс, а не на других частях вашего проекта. Однако публичные члены вашего класса несколько ограничивают это разделение, потому что, если вы измените публичного члена, это может повлиять на другие части вашего проекта.
Сохранение как можно большей части вашего класса приватным (хотя все еще используемым из вашего приложения) максимизирует разделение между ним и остальной частью вашего приложения. Это облегчает понимание только логики в классе, над которым вы работаете, и позволяет вам изменять этих закрытых членов, не думая о том, какие другие части вашего приложения могут быть затронуты.
Проще говоря, почти по той же причине, по которой вы носите одежду. Не все должно быть открыто для публики во все времена. Выбранные вещи должны быть общедоступными, чтобы другие могли взаимодействовать с ними, но другие вещи являются частными и должны храниться внутри этого класса.
Хотя, возможно, мне не следовало использовать слово "внутренний" в последнем предложении, потому что есть третий вариант: internal
модификатор доступа. Имя, используемое в VB.NET (Friend
) наверное понятнее. Это указывает на то, что часть данных должна быть видимой для всех других классов в пределах одной сборки, но скрыта снаружи. Аналогичная аналогия применима: есть вещи, которыми вы можете поделиться со своими ближайшими друзьями, но при этом не хотите быть публичными.
Существуют и другие более сложные причины, такие как включение сокрытия информации, максимальное разделение между конкретным классом и остальной частью приложения и поддержание согласованного общедоступного интерфейса, даже если детали реализации могли быть изменены между версиями, которые вносят свой вклад к хорошему объектно-ориентированному дизайну. Если вы действительно хотите понять все эти мелочи, я предлагаю вам найти хорошую книгу по объектно-ориентированному программированию. Очень сложно, если не невозможно, овладеть объектно-ориентированным языком, таким как C#, без четкого понимания основ.
Вещи не являются общедоступными по умолчанию, потому что они могут содержать конфиденциальную информацию или, по крайней мере, информацию, которую вы не хотите раскрывать как часть открытого интерфейса класса. Сделать что-то публичное - это более важное решение с большим количеством рисков, чем просто сделать это частным, поэтому вы вынуждены принять это решение явно.
Я предлагаю вам прочитать больше об абстракции в объектно-ориентированном программировании. Может быть, статья в Википедии об абстракции - хорошее место для начала.
РЕДАКТИРОВАТЬ: Конрад абсолютно прав, абстракция не подразумевает автоматически "скрытие" информации. Можно сказать, что это роль инкапсуляции в объектно-ориентированном программировании.
Я думаю, что я хотел сказать, что этот вопрос не является специфическим для C#, а скорее просит немного прочтения общих принципов объектно-ориентированного программирования.
Модификатор доступа по умолчанию internal
это означает, что это общедоступно внутри той же сборки и приватно вне сборки.
Если вы хотите представить определенные данные как общедоступные, например текст какой-либо метки, рекомендуется создать общедоступное свойство только для чтения, например:
public string LabelText
{
get { return MyLabel.Text; }
}
Для доступа к нему вам нужно использовать такой код:
string text = classInstance.LabelText;
Таким образом, сам ярлык не является общедоступным, но его текст может прочитать каждый.