Модификаторы доступа - public, но только для некоторых классов

287
23 января 2018, 08:54

Модификатор доступа "public" даёт доступ к члену класса для всех других классов. Возможно ли сделать член класса доступным только для некоторых других классов? Уточнения вопроса: внутри одной сборки; следующие модификаторы доступа не подходят: public, private, internal, protected, protected internal, private protected.

Answer 1

Возможность доступа из некоторых классов (не из всех):

Члены, помеченные модификатором доступа internal - к ним имеют доступ все типы внутри данной сборки, а также типы из дружественных (см. соседний ответ) сборок.

Члены, помеченные модификатором доступа protected - к ним имеют доступ все типы-наследники данного.

Члены, помеченные модификатором protected internal - это объединение двух предыдущих пунктов, т.е. имеют доступ все типы из данной и дружественных сборок, а также типы-наследники из любых сборок.

Члены, помеченные модификатором private protected (C# 7.2 и выше) - это пересечение первых двух пунктов, т.е. имеют доступ типы-наследники данного, но только в пределах данной сборки или дружественных.

Вложенные типы имеют неограниченный доступ ко всем членам данного типа (даже к private).

Answer 2

Можно определить дружественные сборки пометив их специальным атрибутом

InternalsVisibleTo

Вот пример из MSDN:

using System.Runtime.CompilerServices;  
using System;  
[assembly: InternalsVisibleTo("AssemblyB")]  
// The class is internal by default.  
class FriendClass  
{  
    public void Test()  
    {  
        Console.WriteLine("Sample Class");  
    }  
}  
// Public class that has an internal method.  
public class ClassWithFriendMethod  
{  
    internal void Test()  
    {  
        Console.WriteLine("Sample Method");  
    }  
}  
READ ALSO
Не работает задать Accept-Language в webbrowser c#

Не работает задать Accept-Language в webbrowser c#

Пробовал открыть некоторые сайты(facebook, openstreetmap, instagram) в webbrowser с передачей POST запросаПробовал различные варианты и языки

251
Что такое Hangfire? [требует правки]

Что такое Hangfire? [требует правки]

Что такое Hangfire? Можна на примере пожайлуста показать

300
webkitDisplayingFullscreen аналоги

webkitDisplayingFullscreen аналоги

Собственно не смог найти аналоги этого состояния в других браузерах, подскажите пожалуйстаИнтересует Firefox и Edge

305
Паттерн “Модуль”

Паттерн “Модуль”

В книжке «Паттерны для масштабируемых JavaScript-приложений» в разделе, где описывается паттерн "Модуль", написано, что модуль, в отличие от IIFE возвращает...

293