Что является эквивалентом ключевого слова «друг» в C Sharp? - PullRequest
20 голосов
/ 15 января 2009

Что является эквивалентом ключевого слова "друг" в C Sharp?

Как использовать ключевое слово «internal»?

Я прочитал, что ключевое слово «internal» является заменой слова «friend» в C #.

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

Ответы [ 5 ]

34 голосов
/ 15 января 2009
  1. Вы можете использовать модификатор доступа к ключевому слову internal, чтобы объявить тип или элемент типа доступным для кода только в той же сборке.

  2. Вы можете использовать класс InternalsVisibleToAttribute, определенный в System.Rutime.CompilerServices, чтобы объявить тип доступным для кода в той же сборке или только в указанной сборке.

Вы используете первый, как и любой другой модификатор доступа , такой как private. Для остроумия:

internal class MyClass {
    ...
}

Вы используете второе следующим образом:

[assembly:InternalsVisibleTo("MyFriendAssembly", PublicKey="...")]
internal class MyVisibleClass {
    ...
}

Оба из них по праву можно считать эквивалентом friend в C #.

Методы protected уже доступны для производных классов.

30 голосов
/ 13 ноября 2010

Нет, «внутренний» - это не то же самое, что «друг» (по крайней мере, C ++ «друг»)

friend указывает, что этот класс доступен только ОДНОМУ, конкретному классу.
internal указывает, что этот класс доступен ЛЮБОМУ классу в сборке.

6 голосов
/ 15 января 2009

1) Внутренний - это C # equivelant ключевого слова VB.NET «друг», как вы уже догадались (в отличие от замены)

2) Использование выглядит следующим образом

internal void Function() {}
internal Class Classname() {}
internal int myInt;
internal int MyProperty { get; set; }

3) Это, по сути, модификатор доступа, который предусматривает, что доступность свойства class / function / vairiable /, помеченного как внутренняя, как если бы она была общедоступной для сборки, в которой она скомпилирована, и частной для любых других сборок

1 голос
/ 15 января 2009

Ваш подкласс сможет получить доступ к защищенным членам класса, который вы наследуете.

Хотите ли вы предоставить доступ к этим защищенным членам другому классу?

0 голосов
/ 15 января 2009

Внутренний эквивалент друга. Защищенный метод доступен только в том же классе или от наследника. Если вы пытаетесь предоставить защищенные методы от наследника, вы можете заключить их в открытые методы.

...