Разделяемый класс в разных пространствах имен



можно ли создать разделяемый класс в разных пространствах имен? Будет ли это работать правильно?
е.х.:



класс1.cs



namespace name1
{
public partial class Foo
{
Bar1(){
return 10;
}
}
}


класс2.cs



namespace name1.name2
{
public partial class Foo
{
Bar2(){
return 100;
}
}
}


главная.cs



using name1;
using name1.name2;

namespace mainClass
{
public class mainClass
{
Foo classFoo = new Foo();
int Count = classFoo.Bar1() + classFoo.Bar2();
// Will Count = 110?
}
}


что я должен сделать, чтобы заставить его работать? (если мой пример не правильный)

655   6  

6 ответов:

имя класса включает в себя его пространство имен, так что name1.Foo и name1.name2.Foo это два совершенно разных типа. Поэтому короткий ответ на ваш вопрос: нет.

зачем вам нужно делать что-то подобное?

частичный класс возможен только в том же пространстве имен и той же сборке.

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

вот некоторые моменты, которые следует учитывать при реализации разделяемых классов: -

  • используйте разделяемое ключевое слово в каждой части разделяемого класса.

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

  • все части разделяемого класса должны находиться в одном пространстве имен.

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

  • каждая часть разделяемого класса имеет одинаковую доступность. (как частные, общественные или защищенные)

  • Если вы наследуете класс или интерфейс на частичном классе, то он наследуется на всех частях частичного класса.

  • Если часть частичного класса запечатана, то весь класс будет опечатан.

  • Если часть частичного класса абстрактна, то весь класс будет считаться абстрактным классом.

Это не сработает. Компилятор даст вам неоднозначное имя ошибки на Foo classFoo = new Foo(); линии. Чтобы частичные классы работали, они должны находиться в одном пространстве имен, поскольку пространство имен фактически является частью полного имени типа.

кроме того, для статических классов вы можете реализовать что-то подобное с помощью свежего C# 6.0 использование статической функции.

считаем:

namespace SomeLogic1
{
    public static class Util
    {
        public static int Bar1()
        {
            return 1;
        }
    }
}

namespace SomeLogic2
{
    public static class Util
    {
        public static int Bar2()
        {
            return 2;
        }
    }
}

namespace GeneralStuff
{
    using SomeLogic1;
    using SomeLogic2;

    public class MainClass
    {
        public MainClass()
        {
            // Error CS0104
            // 'Util' is an ambiguous reference between 'SomeLogic1.Util' and 'SomeLogic2.Util'
            var result = Util.Bar1() + Util.Bar2(); 
        }
    }
}  

правильно, что не компилируется, выдается сообщение об ошибке ясно. Чтобы исправить ситуацию, вы можете напрямую указать пространства имен (но вы не хотите этого, насколько я понимаю):

namespace GeneralStuff
{
    public class MainClass
    {
        public MainClass()
        {
            var result = SomeLogic1.Util.Bar1() + SomeLogic2.Util.Bar2(); 
        }
    }
}

или вы можете подать заявку используя статический характеристика это образом:

namespace GeneralStuff
{
    using static SomeLogic1.Util;
    using static SomeLogic2.Util;

    public class MainClass
    {
        public MainClass()
        {
            var result = Bar1() + Bar2(); 
        }
    }
}

возможно, это нормально сделать для некоторых классов helper / utils. Но частичные классы-это не путь, как заметили другие.

ограничения на частичные классы и метод из MSDN https://msdn.microsoft.com/en-us/library/wa80x488.aspx

Comments

    Ничего не найдено.