Внутренний vs public в С#
Я хочу знать разницу между модификаторами видимости public
и internal
.
Когда мы должны использовать internal
для класса и public
? Я смущен, когда метод должен быть public
или internal
.
Я читаю, что internal
можно получить через сборку, а public
также можно использовать через сборку, где лежит разница.
Ответы
Ответ 1
public
отображается где угодно.
internal
отображается только внутри сборки
Вы обычно используете внутренние только для защиты внутренних API. Например, вы можете выявить несколько перегрузок метода:
public int Add(int x, int y)
public int Add(int x,int y, int z)
Оба из них вызывают внутренний метод
internal int Add(int[] numbers)
Затем вы можете наложить много сложностей на метод, но "защитите" его, используя методы фасада, которые могут помочь программисту правильно вызвать метод. (Например, метод реализации с параметром массива может иметь произвольный предел значений.)
Также стоит отметить, что использование Reflection позволяет использовать любые и все методы независимо от их видимости. Еще один "взлом" для управления/получения доступа к внутренне скрытым API.
Ответ 2
internal
полезен, когда вы хотите объявить элемент или тип внутри DLL, а не за пределами этого...
обычно, когда вы объявляете участника как Public
, вы можете получить доступ к нему из других DLL. но если вам нужно объявить что-то публичным только внутри вашей библиотеки классов, вы можете объявить его как internal
.
в формальном defenition: внутренние члены видны только внутри текущей сборки...
Ответ 3
Общественность также может быть доступна за пределами сборки. Поэтому, когда у вас есть класс, который не должен быть доступен, каждый класс в сборке должен иметь доступ к нему, тогда внутренняя правильная вещь. Если вам нужен внешний доступ, используйте публикацию.
Ответ 4
internal
также полезен при написании модульных тестов. Атрибут InternalsVisibleTo
позволяет вашей тестовой сборке получить доступ к внутренним методам в вашей сборке кода. То есть вы можете тестировать методы, которые кажутся закрытыми для внешнего мира без использования рефлексии.
Ответ 5
Кроме того, свойства, помеченные как internal
, будут бросать BindingExpression path error
, если они используются для DataBinding в WPF. Поэтому для правильной работы они должны быть public
, даже если DataBinding имеет место в пределах одной сборки.
Ответ 6
Если вы можете ссылаться на сборку снаружи, у вас есть область внутренних и общедоступных классов