У меня есть быстрый вопрос; если я объявляю класс закрытым в пространстве имен внутри сборки, а не внутренним классом, я могу получить доступ к этому классу внутри сборки в обоих случаях, тогда в чем разница между закрытым классом и внутренним классом? или частные и внутренние модификаторы в терминах классов используются при вложении классов в класс?
Mayotic
2
я добавил конкретный проект / сборку как ссылку на другой проект, и как частные, так и внутренние не позволяют мне получить доступ к этому конкретному классу в пространстве имен, так что опять же ... разница между частными и внутренними классами есть? спасибо
Mayotic
9
Вы не можете объявить класс верхнего уровня как закрытый. Компилятор остановит вас.
TheGateKeeper
6
@NetSkay: если вы объявите закрытый класс внутри открытого класса, то этот класс не будет доступен другим классам в вашей сборке, но если вы объявите этот класс как внутренний, он будет доступен в сборке. Хотя они оба не будут доступны вне сборки.
Йогеш Джиндал
2
Если вы пришли из VB.NET, ключевое слово "internal" в C # эквивалентно ключевому слову VB.NET "Friend".
Интересно, что 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.
internalэлементы видны всему коду в сборке, в которой они объявлены.
(и другим сборкам, на которые ссылается [InternalsVisibleTo]атрибут )
privateчлены видны только декларирующему классу. (включая вложенные классы)
Внешний (не вложенный) класс не может быть объявлен private, так как нет содержащей области действия, чтобы сделать его закрытым.
Чтобы ответить на вопрос, который вы забыли задать, protectedчлены похожи на privateчлены, но также видны во всех классах, которые наследуют декларирующий тип. (Но только по выражению хотя бы типа текущего класса)
так какая разница в использовании этого? я все еще не понимаю: X
deadfish
4
Доступ к частным возможен только из класса, внутренний доступен из сборки (проект в VS, т.е. файл dll / exe).
Джеспер Фир Кнудсен
3
Internal позволит вам ссылаться, скажем, на статический класс доступа к данным (для обеспечения безопасности потоков) между несколькими классами бизнес-логики, не подписываясь на них, чтобы наследовать этот класс / отключение друг от друга в пулах соединений, и, в конечном счете, избегать использования класса DAL. содействовать доступу на общественном уровне. Это имеет бесчисленное количество сторонников в дизайне и лучших практиках.
Entity Framework хорошо использует этот тип доступа
внутренние элементы доступны в сборке (доступны только в том же проекте)
частные члены доступны в одном классе
Пример для начинающих
В решении есть 2 проекта (Project1, Project2), а Project1 имеет ссылку на Project2.
Открытый метод, написанный в Project2, будет доступен в Project2 и Project1
Внутренний метод, написанный в Project2, будет доступен только в Project2, но не в Project1
Закрытый метод, написанный в class1 Project2, будет доступен только для того же класса. Он также не будет доступен в других классах проекта 2, кроме проекта 1.
Ответы:
внутренняя предназначена для области сборки (т.е. доступна только из кода в том же .exe или .dll)
private предназначен для области видимости класса (т.е. доступен только из кода в том же классе).
источник
Найти объяснение ниже. Вы можете проверить эту ссылку для более подробной информации - http://www.dotnetbull.com/2013/10/public-protected-private-internal-access-modifier-in-c.html
Частный: - Частные члены доступны только в пределах своего типа (Свой класс).
Внутренний: - Внутренний элемент доступен только внутри сборки по наследству (его производному типу) или по экземпляру класса.
Ссылка :
dotnetbull - что такое модификатор доступа в c #
источник
Protected Internal
обеспечивает более широкий доступ, чемProtected
.protected internal
какprotected OR internal
.With Type
значит?AND
эта матрица для true | false | false | false дляprotected internal
. не интуитивно вместо этого это true | true | true | false как будтоOR'd
.private protected
не очень интуитивны. Для подробностей: docs.microsoft.com/en-us/dotnet/csharp/language-reference/…internal
элементы видны всему коду в сборке, в которой они объявлены.(и другим сборкам, на которые ссылается
[InternalsVisibleTo]
атрибут )private
члены видны только декларирующему классу. (включая вложенные классы)Внешний (не вложенный) класс не может быть объявлен
private
, так как нет содержащей области действия, чтобы сделать его закрытым.Чтобы ответить на вопрос, который вы забыли задать,
protected
члены похожи наprivate
члены, но также видны во всех классах, которые наследуют декларирующий тип. (Но только по выражению хотя бы типа текущего класса)источник
private - инкапсуляция в классе / области действия / структуре и т. д.
внутренняя - инкапсуляция в сборках.
источник
Закрытые члены доступны только внутри тела класса или структуры, в которой они объявлены.
Внутренние типы или элементы доступны только внутри файлов в одной сборке
источник
Internal позволит вам ссылаться, скажем, на статический класс доступа к данным (для обеспечения безопасности потоков) между несколькими классами бизнес-логики, не подписываясь на них, чтобы наследовать этот класс / отключение друг от друга в пулах соединений, и, в конечном счете, избегать использования класса DAL. содействовать доступу на общественном уровне. Это имеет бесчисленное количество сторонников в дизайне и лучших практиках.
Entity Framework хорошо использует этот тип доступа
источник
внутренние элементы доступны в сборке (доступны только в том же проекте)
частные члены доступны в одном классе
Пример для начинающих
В решении есть 2 проекта (Project1, Project2), а Project1 имеет ссылку на Project2.
источник