Должен ли я использовать внутреннюю или общедоступную видимость по умолчанию?

StackOverflow https://stackoverflow.com/questions/106941

  •  01-07-2019
  •  | 
  •  

Вопрос

Я довольно новый разработчик C# и .Net.Недавно я создал оснастку MMC с использованием C# и был доволен тем, насколько легко это было сделать, особенно после того, как я услышал множество ужасных историй от некоторых других разработчиков в моей организации о том, как сложно это сделать на C++.

В какой-то момент я практически прошел весь проект и сделал каждый экземпляр ключевого слова «public» значением «внутренний», за исключением случаев, когда среда выполнения требует запуска оснастки.Что вы думаете по этому поводу: следует ли вообще делать классы и методы общедоступными или внутренними?

Это было полезно?

Решение

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

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

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

Другие советы

То, что вы сделали, — это именно то, что вам следует делать;дайте своим классам как можно минимальную видимость.Черт возьми, если вы действительно хотите сделать все возможное, вы можете сделать все internal (максимум) и используйте InternalsVisibleTo атрибут, чтобы вы могли разделить свою функциональность, но при этом не подвергать ее воздействию неизвестного внешнего мира.

Единственная причина обнародовать информацию заключается в том, что вы упаковываете свой проект в несколько DLL и/или EXE-файлов и (по какой-то причине) не хотите их использовать. InternalsVisibleTo, или вы создаете библиотеку для использования третьими лицами.Но даже в библиотеке, предназначенной для использования третьими лицами, вам следует постараться уменьшить «площадь поверхности», где это возможно;чем больше классов у вас есть, тем более запутанной будет ваша библиотека.

В C# хороший способ обеспечить минимально возможную видимость — не использовать модификаторы видимости до тех пор, пока они вам не понадобятся.Все в C# по умолчанию имеет минимально возможную видимость:внутренний для классов и частный для членов класса и внутренних классов.

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

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

Я предпочитаю избегать пометки классов как public если только я явно не хочу, чтобы мой клиент их потреблял, и я готов их поддержать.

Вместо того, чтобы отмечать класс как internal, я оставляю поле доступности пустым.Сюда, public бросается в глаза как нечто примечательное.(Исключением, конечно, являются вложенные классы, которые необходимо помечать, чтобы они были видимы даже в одной сборке.)

Большинство занятий должно быть internal, но большинство нечастных членов должны быть public.

Вопрос, который вам следует задать об участнике: «Если бы класс был сделан public хотел бы я, чтобы член был разоблачен?».Ответ обычно «да (так что public)", потому что классы без доступных членов бесполезны!internal у членов действительно есть роль;это «черный доступ», предназначенный только для близких родственников, живущих в том же собрании.

Даже если ваш класс остается внутренним, приятно видеть, какие участники являются входными, а какие — задними.И если вы когда-нибудь измените его на общедоступный, вам не придется возвращаться и думать о том, что есть что.

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

Есть ли причина, по которой вам нужно использовать Internal вместо Private?Вы понимаете, что Internal имеет область действия на уровне сборки.Другими словами, внутренние классы/члены доступны всем классам в многоклассовой сборке.

Как говорилось в некоторых других ответах, обычно выбирайте максимально возможный уровень инкапсуляции (т.е. частный), если вам действительно не нужен внутренний/защищенный/публичный.

Я нашел проблема с использованием внутренних классов как можно больше.Вы не можете сделать методы, свойства, поля и т. д. этого типа (или типа параметра или типа возвращаемого значения) более видимыми, чем внутренние.Это приводит к тому, что конструкторы являются внутренними, а также свойствами.Это не должно быть проблемой, но на самом деле при использовании Visual Studio и дизайнера xaml возникают проблемы. Ложноположительные ошибки обнаруживаются проектировщиком из-за того, что методы не являются общедоступными, свойства пользовательского элемента управления кажутся дизайнеру невидимыми.Не знаю, сталкивались ли уже другие с такими вопросами...

Вам следует постараться сделать их как можно более видимыми, но, как сказал Майк выше, это вызывает проблемы с UserControls и использованием VS Designer с этими элементами управления в формах или других UserControls.

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

Недавно у меня возникла проблема: дизайнер продолжал удалять строку this.myControl = new MyControl() из метода InitializeComponent(), поскольку UserControl MyControl был помечен как внутренний вместе с его конструктором.

Я думаю, что это действительно ошибка, потому что даже если они помечены как внутренние, они все равно отображаются на панели инструментов для добавления в дизайнер: либо Microsoft нужно показывать только общедоступные элементы управления с помощью общедоступных конструкторов, либо им нужно заставить его работать с внутренними элементами управления, как хорошо.

Это зависит от того, насколько вы контролируете код, который его использует.При разработке Java я по умолчанию делаю все свои материалы общедоступными, потому что геттеры раздражают.Однако я также могу позволить себе роскошь изменить что-либо в своей кодовой базе, когда захочу.Раньше, когда мне приходилось публиковать код для потребителей, я всегда использовал частные переменные и геттеры.

Не выбирайте вариант «по умолчанию», который лучше всего соответствует потребностям видимости для этого конкретного класса.Когда вы выбираете новый класс в Visual Studio, шаблон создается как:

class Class1
{
}

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

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

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

Я полностью не согласен с ответами на данный момент.Я считаю, что внутреннее — ужасная идея, не позволяющая другой сборке наследовать ваши типы или даже использовать ваши внутренние типы, если возникнет необходимость в обходном пути.

Сегодня мне пришлось использовать отражение, чтобы добраться до внутренностей System.Data.DataTable (мне нужно молниеносно построить datatable, без всех его проверок), и мне пришлось использовать отражение, поскольку ни один тип был доступен мне;все они были помечены как внутренние.

по умолчанию класс создается как внутренний в С#:внутренние средства:Доступ ограничен текущей сборкой.

видетьhttp://msdn.microsoft.com/en-us/library/0b0thckt.aspx

Хорошая статья, область значений по умолчанию является внутренней:http://www.c-sharpcorner.com/UploadFile/84c85b/default-scope-of-a-C-Sharp-class/

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top