J'ai une classe partielle comme celle-ci Comment ces 2 classes fusionnent-elles au moment de la construction? Donnez-moi s'il vous plaît expliquer à ce sujet. p> p>
8 Réponses :
Il ne compile pas car vous ne pouvez pas avoir deux méthodes avec le même nom dans une classe. P>
Si l'utilisateur 2Différent travaillant sur ces classes, ils peuvent faire cette erreur.Comment puis-je éviter cela.
@Pankaj: Faites-les parler les uns aux autres =)
@Pakaj - en ayant un bon système d'intégration continu qui ne leur permet pas de vérifier le code qui ne compilera pas.
@Jens - Ne soyez pas Daft, ce sont des développeurs. Peut-être postez-le donc, il y a de bonnes chances qu'ils puissent le voir ...
Ou n'utilisez pas une structure de classe partielle pour permettre à différents devs de travailler sur la même classe - faites-la en une seule classe - laissez votre source de contrôle gérer le problème (thats ce qu'ils font). Le premier à vérifier dans les victoires et la seconde doit fusionner des changements.
@Pankaj, je ne vois pas comment ce serait un problème que vous devez empêcher d'une manière ou d'une autre? Si le code ne compile pas, il ne compile pas. Il y a une million de raisons possibles pour lesquelles le code ne compile pas, c'est juste l'un d'entre eux (et un très rare que je n'ai jamais rencontré). Compiler les erreurs de temps ne devrait pas être beaucoup de problème car elles sont généralement faciles à réparer.
@Jens: c'est exactement i> ce que je pensais immédiatement à lire la question, puis j'ai fait défiler votre commentaire et j'ai vu votre commentaire :) @pankaj: Comme d'autres l'ont déjà dit, vous ne devriez pas vérifier dans le code qui n'a pas 't compiler. Même s'ils se détestent suffisamment de ne pas communiquer, dès que l'utilisateur 2 tire les changements d'utilisateur 1 et réalise que la construction est cassée, il doit le réparer avant de vérifier le sien. Je sais, je sais: "si seulement", hein? :)
Outre les erreurs syntaxiques, votre code ne compilera pas. Vous obtiendrez l'erreur suivante: p>
type 'myNamespace.abc' définit déjà un membre appelé "godetage" avec les mêmes types de paramètres p> blockQuote>
C'est parce que le compilateur fusionnera toutes les parties d'une classe partielle en une seule classe comme Section 10.2 de la spécification de langue
c # forte> explique: p> À l'exception des méthodes partielles (§10.2.7), l'ensemble des membres d'un type déclaré en plusieurs parties est simplement l'union de l'ensemble des membres déclarés dans chaque partie. Les corps de toutes les parties de la déclaration de type partagent le même espace de déclaration (§3.3) et la portée de chaque membre (§3.7) s'étend aux corps de toutes les pièces. p> blockQuote>
C # ne permet pas de disposer de méthodes avec les mêmes noms et avec le même numéro et les mêmes types d'arguments dans une seule classe. Ceci est indiqué dans la section 1.6.6 de la spécification: p>
La signature d'une méthode doit être unique dans la classe dans laquelle la méthode est déclarée. La signature d'une méthode consiste en le nom de la méthode, le nombre de paramètres de type et le nombre, les modificateurs et les types de ses paramètres. La signature d'une méthode n'inclut pas le type de retour. P> blockQuote>
Il y a une option cependant d'ajouter la déclaration d'une méthode dans une partie d'une classe partielle et de la mise en œuvre dans une autre:
méthodes partielles forts>. Vous pouvez en savoir plus sur eux dans l'article de blog d'Eric Lippert sur ce sujet: P> Quelle est la différence entre une méthode partielle et une classe partielle? strong> p> blockQuote>
Ils ne fusionnent pas: vous aurez une erreur de compilation. P>
Il y aura une erreur de temps Que se passe-t-il au moment de la construction est le compilateur code> combine tous les membres définis dans Dans votre cas, il sera d'une erreur forte> Mentionner
Une mise en garde moderne - Ce code serait totalement fine si les classes partielles étaient divisées en 2 fichiers distincts pour 2 cibles de plate-forme distinctes dans une bibliothèque de classe standard multi-ciblée (à l'aide du système de projet "SDK" relativement neuf). Voici un Exemple réel de cela.
@Markzhukovsky, merci pour ce commentaire. Je cherche exactement le code source de .NET CORE runtimeInformation.dll ici: github.com/dotnet/runtime/tree/... et je vois la même propriété" OSDescription "implémentation dans 2 fichiers distincts, donc merci!
Ils ne fusionneront pas: Compilez l'erreur de temps. Ils pourraient fusionner dans votre cas si vous les mettez accidentellement dans différents espaces de noms. P>
Le pré-processeur (ou compilateur peut-être) analyse votre dossier de projet lors de l'une de ses exécutions et vérifie les noms de classes situés dans un projet (ou un assemblage à préciser). Ensuite, il marque des classes partielles et vérifie s'il y a des définitions mouplées.
Demandez à Eric Lippert sur les détails. Il fusionne ensuite des méthodes, des commentaires, des attributs, des membres, des interfaces, etc.
Avoir une lecture sur la spécification C # Lang.
Vos méthodes n'ont pas de modfier partiel, alors que les gars avant de me remarquer, il ne compilera pas. P>
Les classes partielles sont fusionnées pendant la compilation. Les compilateurs recherchent les classes partielles et les intégrent tout en compilant. Il combine simplement des classes partielles "deux" en une seule classe. Il n'y a pas de modification effectuée dans le CLR pour la mise en œuvre de classes partielles. Vous pouvez le considérer comme la fusion de «deux» classes partielles.
Par exemple pour votre code, vous aurez: p> et cela vous donnera une erreur parce que vous Impossible de disposer de 2 méthodes avec le même nom et la même signature (voir getage code> méthode). p> p>
Essayez ceci: laissez le partial em> hors de la première classe! p> p> p>
Ce code ne fonctionnera pas, donnera une erreur suivante: "Modificateur partiel manquant sur la déclaration de type" ABC "; une autre déclaration partielle de ce type existe"