Внутренний 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

Если вы можете ссылаться на сборку снаружи, у вас есть область внутренних и общедоступных классов