Разделяемый класс в разных пространствах имен
можно ли создать разделяемый класс в разных пространствах имен? Будет ли это работать правильно?
е.х.:
класс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?
}
}
что я должен сделать, чтобы заставить его работать? (если мой пример не правильный)
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