web-dev-qa-db-fra.com

Classe partielle dans différents espaces de noms

Puis-je créer une classe partielle dans différents espaces de noms? Cela fonctionnera-t-il correctement? ex.:

class1.cs

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

class2.cs

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

main.cs

using name1;
using name1.name2;

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

Que dois-je faire pour que cela fonctionne? (si mon exemple n'est pas correct)

57
RAMe0

Le nom d'une classe inclut son espace de noms, donc name1.Foo et name1.name2.Foo sont deux types complètement distincts. Donc, la réponse courte à votre question est: Non.

Pourquoi avez-vous besoin de faire quelque chose comme ça?

86
CodingGorilla

La classe partielle n'est possible que dans le même espace de noms et le même assembly.

L'espace de noms peut être dans deux assemblys différents, mais pas la classe partielle.

26
Abdul Saboor

Voici quelques points à considérer lors de l'implémentation des classes partielles: -

  • Utilisez un mot-clé partiel dans chaque partie de la classe partielle.

  • Le nom de chaque partie de la classe partielle doit être le même, mais le nom du fichier source pour chaque partie de la classe partielle peut être différent.

  • Toutes les parties d'une classe partielle doivent se trouver dans le même espace de noms.

  • Chaque partie d'une classe partielle doit se trouver dans le même assembly ou DLL, en d'autres termes, vous ne pouvez pas créer une classe partielle dans les fichiers source d'un projet de bibliothèque de classes différent.

  • Chaque partie d'une classe partielle a la même accessibilité. (comme privé, public ou protégé)

  • Si vous héritez d'une classe ou d'une interface sur une classe partielle, elle est héritée sur toutes les parties d'une classe partielle.

  • Si une partie d'une classe partielle est scellée, la classe entière sera scellée.

  • Si une partie d'une classe partielle est abstraite, alors la classe entière sera considérée comme une classe abstraite.

11
Farhan S.

Cela ne fonctionnera pas. Le compilateur vous donnera une erreur de nom ambigu sur la ligne Foo classFoo = new Foo();. Pour que les classes partielles fonctionnent, elles doivent se trouver dans le même espace de noms car l'espace de noms fait en fait partie du nom complet du type.

7
Harry Steinhilber

En outre, pour les classes statiques, vous pouvez implémenter quelque chose comme ça à l'aide de C # 6.0 en utilisant la fonction statique .

Considérer:

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(); 
        }
    }
}  

À droite, cela ne compile pas, le message d'erreur est clair. Pour corriger la situation, vous pouvez spécifier directement des espaces de noms (mais vous ne le voulez pas pour autant que je sache):

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

[~ # ~] ou [~ # ~] vous pouvez appliquer en utilisant statique fonction de cette façon:

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

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

Peut-être que c'est correct de le faire pour certaines classes helper/utils. Mais les classes partielles ne sont pas le chemin, comme d'autres l'ont remarqué.

3
psfinaki

Restrictions sur les classes partielles et la méthode de MSDN https://msdn.Microsoft.com/en-us/library/wa80x488.aspx

2
Sandeep