Модификаторы внутреннего и частного доступа


Ответы:


516

внутренняя предназначена для области сборки (т.е. доступна только из кода в том же .exe или .dll)

private предназначен для области видимости класса (т.е. доступен только из кода в том же классе).


6
У меня есть быстрый вопрос; если я объявляю класс закрытым в пространстве имен внутри сборки, а не внутренним классом, я могу получить доступ к этому классу внутри сборки в обоих случаях, тогда в чем разница между закрытым классом и внутренним классом? или частные и внутренние модификаторы в терминах классов используются при вложении классов в класс?
Mayotic

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

9
Вы не можете объявить класс верхнего уровня как закрытый. Компилятор остановит вас.
TheGateKeeper

6
@NetSkay: если вы объявите закрытый класс внутри открытого класса, то этот класс не будет доступен другим классам в вашей сборке, но если вы объявите этот класс как внутренний, он будет доступен в сборке. Хотя они оба не будут доступны вне сборки.
Йогеш Джиндал

2
Если вы пришли из VB.NET, ключевое слово "internal" в C # эквивалентно ключевому слову VB.NET "Friend".
Brain2000

207

Найти объяснение ниже. Вы можете проверить эту ссылку для более подробной информации - http://www.dotnetbull.com/2013/10/public-protected-private-internal-access-modifier-in-c.html

Частный: - Частные члены доступны только в пределах своего типа (Свой класс).

Внутренний: - Внутренний элемент доступен только внутри сборки по наследству (его производному типу) или по экземпляру класса.

введите описание изображения здесь

Ссылка :

dotnetbull - что такое модификатор доступа в c #


17
Интересно, что Protected Internalобеспечивает более широкий доступ, чем Protected.
Дэн Бешард

9
@ Дэн, полностью согласен. Это может быть полезно читать и думать protected internalкак protected OR internal.
chessofnerd

7
Что With Typeзначит?
Джеймс Вежба

@ Да, я предполагал, что это будет просто таблица истинности, и ANDэта матрица для true | false | false | false для protected internal. не интуитивно вместо этого это true | true | true | false как будто OR'd.
Ferr

1
Кстати, в C # 7.2 только что добавлен модификатор «protected AND internal», хотя выбранные ключевые слова private protectedне очень интуитивны. Для подробностей: docs.microsoft.com/en-us/dotnet/csharp/language-reference/…
Джо Сьюэлл,

70

internalэлементы видны всему коду в сборке, в которой они объявлены.
(и другим сборкам, на которые ссылается [InternalsVisibleTo]атрибут )

privateчлены видны только декларирующему классу. (включая вложенные классы)

Внешний (не вложенный) класс не может быть объявлен private, так как нет содержащей области действия, чтобы сделать его закрытым.

Чтобы ответить на вопрос, который вы забыли задать, protectedчлены похожи на privateчлены, но также видны во всех классах, которые наследуют декларирующий тип. (Но только по выражению хотя бы типа текущего класса)


8

private - инкапсуляция в классе / области действия / структуре и т. д.

внутренняя - инкапсуляция в сборках.


6

Закрытые члены доступны только внутри тела класса или структуры, в которой они объявлены.

Внутренние типы или элементы доступны только внутри файлов в одной сборке


так какая разница в использовании этого? я все еще не понимаю: X
deadfish

4
Доступ к частным возможен только из класса, внутренний доступен из сборки (проект в VS, т.е. файл dll / exe).
Джеспер Фир Кнудсен

3

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

Entity Framework хорошо использует этот тип доступа


0

внутренние элементы доступны в сборке (доступны только в том же проекте)

частные члены доступны в одном классе

Пример для начинающих

В решении есть 2 проекта (Project1, Project2), а Project1 имеет ссылку на Project2.

  • Открытый метод, написанный в Project2, будет доступен в Project2 и Project1
  • Внутренний метод, написанный в Project2, будет доступен только в Project2, но не в Project1
  • Закрытый метод, написанный в class1 Project2, будет доступен только для того же класса. Он также не будет доступен в других классах проекта 2, кроме проекта 1.
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.