Как сделать так, чтобы классы в том же пространстве имен, что и у класса, имели доступ к переменной, а классы вне пространства имен не в C#? - PullRequest
0 голосов
/ 30 апреля 2020
namespace ExampleNamespaceOne {
    public class ExampleClassOne {
        public float Example = 0.5f;
    }
    public class ExampleClassTwo {
        // Has access to example.
    }
}

namespace ExampleNamespaceTwo {
    public class ExampleClassOne {
        // Doesn't have access to example.
    }
}

Возьмите этот код для примера. Я хочу, чтобы переменная Example в ExampleClassOne в ExampleNamespaceOne была доступна любому классу в его пространстве имен. Поэтому я хочу, чтобы ExampleClassTwo мог иметь к нему доступ (поскольку он находится в том же пространстве имен), но я не хочу, чтобы ExampleClassOne в ExampleNamespaceTwo мог получить к нему доступ (поскольку он находится в другом пространстве имен).

Ответы [ 4 ]

0 голосов
/ 30 апреля 2020

Вы можете в значительной степени делать то, что хотите, если вы счастливы использовать вложенные типы.

Проверьте этот пример:

public class ExampleClassOne
{
    private float Example = 0.5f;
    public class ExampleClassTwo
    {
        public ExampleClassTwo(ExampleClassOne one)
        {
            Console.WriteLine(one.Example); //access to `Example`!
        }
    }
}

public class ExampleClassThree
{
    public ExampleClassThree(ExampleClassOne one)
    {
        Console.WriteLine(one.Example); //No access to `Example`!
    }
}

ExampleClassTwo имеет доступ к ExampleClassOne частные переменные, потому что они вложены в него.

ExampleClassThree не имеет доступа.

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

var eco = new ExampleClassOne();
var ect = new ExampleClassOne.ExampleClassTwo(eco);

Теперь, это может быть немного громоздким, чтобы иметь дело с вложенными типами, поэтому общий шаблон, чтобы дать вам эту функциональность, состоит в том, чтобы реализовать его следующим образом:

public class ExampleClassOne
{
    private float Example = 0.5f;
    public class ExampleClassTwoImpl : ExampleClassTwo
    {
        internal ExampleClassTwoImpl(ExampleClassOne one)
        {
            Console.WriteLine(one.Example); //access to `Example`!
        }
    }
}

public class ExampleClassTwo
{
    public static ExampleClassTwo Create(ExampleClassOne one)
        => new ExampleClassOne.ExampleClassTwoImpl(one);

    internal ExampleClassTwo() { }
}

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

var eco = new ExampleClassOne();
var ect = ExampleClassTwo.Create(eco);
0 голосов
/ 30 апреля 2020

Вы не можете, однако возможно определить переменную / тип / ... с видимостью, которая делает ее "publi c" в той же сборке, но не доступна из любой другой сборки, возможно, это могло бы быть соответствует вашей цели.

https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/internal

0 голосов
/ 30 апреля 2020

Использовать внутренний модификатор:

    namespace ExampleNamespaceOne {
        public class ExampleClassOne
    {
        internal float Example = 0.5f;
    }
    public class ExampleClassTwo
    {
        public ExampleClassTwo()
        {
            ExampleClassOne obcts = new ExampleClassOne();
            obcts.Example = 1.0f;
        }

        // Has access to example.
    }
    }

    namespace ExampleNamespaceTwo 
    {
        public ExampleClassOne()
            {
                Practice.ExampleClassOne obcts = new Practice.ExampleClassOne();
\\ Doesn't have access to example.
                obcts.Example = 1.0f;
            }

    }

Для получения дополнительной информации см. - https://www.c-sharpcorner.com/uploadfile/puranindia/what-are-access-modifiers-in-C-Sharp/

0 голосов
/ 30 апреля 2020

Вы не можете, пространства имен - это просто удобный инструмент для классификации типов и предотвращения конфликтов имен.

Чтобы достичь более или менее того, что вам нужно, вам необходимо:

  1. Создать сборку с ExampleNameSpaceOne пространством имен и типами, содержащимися внутри.
  2. Создать ExampleClassOne.Example internal

Теперь любой тип, определенный в любой другой сборке, не сможет см. Example.

Конечно, Example всегда будет доступен через отражение, но вы не можете предотвратить это.

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