1

Я знаю, это может показаться глупым, но я действительно хочу знать :) -им обучение 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 

Так какой смысл сделать его недоступным в других формах? почему каждая вещь не является общедоступной или ее не общедоступной по умолчанию?

Спасибо.

+0

Когда вы говорите 'object', вы имеете в виду' member' или 'class'? – CodesInChaos

+0

«Моя точка зрения заключается в том, что вы не можете просто набирать label1.text, вам нужно ввести class.label1.text, поэтому нет возможности получить прослушивание, потому что в каждой из форм/классов есть метка1». Какие? –

ответ

6

Точка использования классов - это возможность разделить ваш код на логически связанные части. Это упрощает понимание и поддержку вашего кода.

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

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

3

Предлагаю вам больше узнать об абстракции в объектно-ориентированном программировании. Может быть, Wikipedia article on abstraction - хорошее место для начала.

EDIT: Konrad абсолютно прав, абстракция автоматически не подразумевает «скрытие» информации. Можно сказать, что это роль encapsulation в объектно-ориентированном программировании.

Я предполагаю, что я хотел сказать, что этот вопрос не специфичен для C#, а скорее требует немного чтения общих принципов объектно-ориентированного программирования.

+0

Это неверно. Абстракция не требует * скрытия информации. Это просто означает, что мы не можем эффективно использовать раскрытую информацию. Но в принципе абстракция будет работать так же хорошо, как только публичные данные. На самом деле, я знаю библиотеки, которые * делают *, что (по глупым причинам). –

7

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

Хотя, вероятно, я не должен был использовать слово внутри этого последнего предложения, потому что есть третий вариант: модификатор доступа internal. Имя, используемое в VB.NET (Friend), вероятно, более ясное. Это указывает на то, что часть данных должна быть видна всем другим классам внутри одной сборки, но скрыта извне. Аналогичная аналогия применяется: есть вещи, которые вы могли бы поделиться со своими ближайшими друзьями, но все же не хотите быть публичными.

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

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

+0

Понравилась одежда! :-) –

+0

Почему я не хотел бы предоставлять эту информацию другим файлам формы/класса? – user646317

+0

@user: Потому что другим классам не нужно знать эту информацию. Это деталь реализации этого конкретного класса, и сохранение его частного имеет несколько преимуществ. Во-первых, он упрощает внешний интерфейс, который вы представляете другим классам. Это упрощает программирование против вашего класса. Во-вторых, уменьшая объем внутренней информации, которую вы раскрываете, вы упрощаете изменение реализации своего класса, не нарушая других классов, которые используют этот класс. Таким образом, вы можете изменять внутренние вспомогательные функции, не нарушая при этом другой код. Это способствует повторному использованию кода. –

0

Модификатор доступа по умолчанию - internal, что означает, что он является публичным внутри одной сборки и закрыт вне сборки.

Если вы хотите, чтобы выставить определенные данные общедоступными, например, текст какой-то ярлык, лучшая практика создания общественной собственности только для чтения, как это:

public string LabelText 
{ 
    get { return MyLabel.Text; } 
} 

Чтобы получить доступ к нему вы должны будете использовать такой код :

string text = classInstance.LabelText; 

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

Смежные вопросы