2010-04-16 3 views
7

Можно создать дубликат:
Namespace only class visibility in C#/.NET ?частные классы внутри пространств имен

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

Есть ли причина, которая невозможна в C#?

Редактировать: Я немного изменил вопрос, поскольку компилятор сообщает мне, что private не разрешен. Может ли кто-нибудь сказать мне причину этого?

+0

Есть ли что-нибудь, что не было задано? Пропустил это, когда я написал вопрос. Но какое представление о том, почему это так? – user318253

+0

hehe ... Мне интересно, как люди находят повторяющиеся сообщения, которые быстро, хотя они даже не перечислены в разделе «Родственные» справа. @James: Как вы это делаете? :) – gehho

+0

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

ответ

2

В дополнение к ответу gehho: пространство имен является лишь частью имени типа (которое позволяет только для всех типов иметь уникальные имена) - вот почему вы не можете ограничивать доступ к типам внутри пространства имен.

+0

Таким образом, пространства имен существуют только во избежание конфликтов и не столько для группировки так, как это делает папка? Пространство имен предоставляет контекст только содержащим его типам - это то, что вы говорите? – user318253

+0

@blacklion: подумайте о пространстве имен как о уникальном идентификаторе для типа. Это позволяет вам иметь 2 класса с одинаковым именем, например. 'System.DateTime' отличается от' MyNamespace.DateTime' – James

+0

Спасибо, я думаю, что думал о пакетах в java – user318253

5

Это невозможно.

Вы можете ограничить доступ к сборке , содержащей класс, используя модификатор internal.

Вы также можете ограничить доступ к классу одному классу , сделав класс вложенным классом. Например. если вы сделаете класс B приватным вложенным классом в классе A, B будет доступен только A.

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

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

+0

Есть ли причина, по которой это невозможно в C#? Почему создатели этого не допускают? – user318253

+0

Здесь очень сложно задавать вопросы. Я должен сказать это так тщательно. к вашему правлению: например, private разрешен для типов внутри классов, и все внутри класса имеет к ним доступ. private не ограничивает ВСЕ доступ к типу – user318253

+0

Я не понимаю ваш комментарий. Это вопрос? Если да, пожалуйста, перефразируйте его или дайте более подробную информацию. Или вы думаете, что мой ответ неправильный? – gehho

2

Вы можете ограничить видимость текущей сборки с помощью класса internal.

Однако вы можете разрешить другой сборке получать видимость вашей сборки, используя атрибут InternalsVisibleTo.

Пример

Определение MyInternalClass в сборке AssemblyOne:

[assembly: InternalsVisibleTo("AssemblyTwo")] 

internal class MyClass { 
    internal void DoSomeAction() { } 
} 

Затем определим еще один класс в AssemblyTwo:

public class MyOtherClass 
{ 
    public void DoAnotherAction() 
    { 
     MyClass c = new MyClass(); 
     c.DoSomeAction(); 
    } 
} 
+0

Спасибо, это был не мой вопрос, хотя – user318253

+0

@blacklion: Да, это не ограничивает видимость пространства имен. Я неправильно понял ваш вопрос. –

0

Потому что вы можете добавить типы в пространстве имен в любой другой внешней сборки , Являются ли типы в том же пространстве имен, но разные сборки видят ваши «частные типы»?

Если нет, нам трудно понять поведение (один тип из пространства имен может видеть ваш тип, другой - нет). Если да, то мы имеем противоречие с определением «частный», поскольку типы в разных сборках будут иметь доступ к «частным» деталям сборки.

+0

см. Ответ Thibault Falise относительно InternalsVisibleTo – user318253

0

Вы можете объявить произвольные пространства имен, чтобы вы могли, например, объявить свои собственные классы как часть пространства имен System. Конечно, это приведет к ошибке, если Microsoft решит добавить класс с тем же именем в свое пространство имен.

Почему вы хотите иметь «видимость пространства имен»? Это означало бы особый вид публики, поскольку любой мог объявить свой класс как находящееся в требуемом пространстве имен и, таким образом, получить доступ к вашим классам.

Если вы хотите как функцию безопасности, это не сработает. Если вы хотите разрешить ваше пространство имен, скрывая «внутренние» классы, например, вы можете иметь пространство имен Internals под вашим основным пространством имен.

Смежные вопросы