Comment "importer" une classe statique en C #?
J'ai créé un public static de la classe utils.cs je veux l'utiliser dans d'autres classes sans la préfixation de la méthode avec utils, quelle est la syntaxe pour ce faire ?
source d'informationauteur programmernovice
Vous devez vous connecter pour publier un commentaire.
Ce que Jon Skeet n'est pas vous dire, c'est que vous peut globale des membres statiques en c#. Votre classe utilitaire peut en effet devenir une réalité en c#.
Malheureusement, Microsoft a déterminé que le processus de construction de ces membres comme au-dessus de la simple développement "normal", et exige que vous forge de raw langage intermédiaire. Un puissant motif est au-dessus de communes de la syntaxe et de l'amicale des icônes).
Ici est la condition de la séquence de caractères utf-8 (il garde soigneusement):
(Vous pouvez compiler cet exemple en invoquant ilasm.exe à partir du SDK invite de commande, se souvenant de l'utilisation de la dll switch)
ilasm.exe sortie:
Microsoft (R) .NET Framework IL Assembler. Version 2.0.50727.4016
Copyright (c) Microsoft Corporation. Tous droits réservés.
L'assemblage 'globalmethods.msil " pour DLL --> 'globalmethods.dll'
Le fichier Source est ANSI
mondiale.msil(7) : avertissement-Référence non déclarées extern assemblée 'mscorlib'.
La tentative d'auto-détection
Assemblé mondiale de la méthode MyUtilMethod
La création de fichier PE
Émettant des classes:
Émettant des champs et des méthodes:
Les Méthodes Globales: 1;
Émettant des événements et des propriétés:
Mondial
L'écriture du fichier PE
L'opération s'est déroulée avec succès
Une fois que vous avez compilé votre nouvellement créé de l'assemblée ("globalmethods.dll" par exemple), c'est juste une question de l'ajout d'une référence dans Visual Studio. Lorsque ce est terminé, vous feriez mieux d'être assis, car il sera temps d'écrire un peu de code réel:
Oui, vous avez appelé une méthode Globale en c#.
*S'il vous plaît ne pas l'utiliser, c'est uniquement à titre d'exemple 🙂 Aussi, vous pourriez probablement écrire vos méthodes globales dans une autre langue qui les prennent en charge, tels que VB.NET.
Il n'y a pas moyen de faire cela en C# - pas d'équivalent direct de Java statique de la fonction d'importation, par exemple.
Pour plus d'informations sur pourquoi cela est le cas, voir Eric Lippert post sur le sujet et un semblable question.
Dans certaines circonstances, cependant, il peut être judicieux d'écrire les méthodes d'extension qui vivent dans des non-imbriquées les classes statiques, mais "faire semblant" d'être les méthodes d'instance d'une autre classe. Il est utile de réfléchir soigneusement avant de vous présenter ces derniers, car ils peut être source de confusion, mais ils peuvent également améliorer la lisibilité lorsque utilisé à bon escient.
Ce genre de méthodes utilitaires ont été pensez-vous?
Au minimum, vous devez indiquer au moins le nom de la classe. Tous les à l'aide de la directive n'est de vous permettre de laisser de côté l'espace de noms. Vous pouvez également utiliser l'aide de la directive pour spécifier un alias à la Place de l'ensemble de la namespace.class nom, mais alors vous devez utiliser l'alias...
Je suppose que vous pourriez faire de l'ensemble de vos méthodes dans utils.cs que les méthodes d'extension à la classe de l'objet, mais vous auriez encore préfixe de vos méthodes avec des ".", ce qui n'est probablement pas ce que vous voulez.
Dans ce fil il y a quelques interrogations et argumenation de ne pas utiliser les méthodes globales, mais je voudrais ajouter qu'il ya un autre genre de scénario lors de la statique des importations sont souhaitables, par exemple lorsque vous souhaitez apporter à certaines constantes dans l'étendue.
Par exemple, si je veux construire des instructions SQL, je préfère ne pas utiliser dupliqué les littéraux de chaîne, comme dans cet exemple de code (à l'aide de dynasql):
Je préfère le faire:
Si je serais à l'aide de la suggestion par le Loadmaster (16 Oct à 16:49) alors je pourrais faire ceci:
Cependant, je préfère apporter la constante dans le champ d'application répétée mais nécessaire nom et dot qualifer à tous (que vous pouvez faire avec Java statique des importations), c'est à dire le faire:
Mais il n'est pas possible d'utiliser ce type de syntaxe avec C# ?
Par la manière, personne ne sait de mieux .NET-library pour la création de SQL que dynasql, ce qui ne semble pas être conçu pour être indépendant de l'exécution de SQL (comme le problème décrit ici: http://dynasql.codeplex.com/Thread/View.aspx?ThreadId=81988)
?
/Sven
Le "bon" (à partir d'un OO point de vue de la mise d'un membre dans la portée, est de la mettre en ŒUVRE dans le champ d'application:
Maintenant dans le reste de
MyWorkingClass
(ou dans les classes dérivées si vous modifiez le privé protégé), vous pouvez référencerMySpecialValue
des milliers de fois sans aucune qualification supplémentaire.Je ne suis pas sûr de ce que vous essayez d'accomplir en omettant la
Utils
du préfixe d'appels de méthode. Mais si c'est juste pour économiser de l'espace ou de rendre le code un peu plus facile à lire, vous pourriez alias l'importation d'un nom plus court:Je n'ai jamais vraiment pris en charge pour la "méthode globale" concept. En outre, il semble que cela rend beaucoup plus lisible et maintenable code pour ne pas avoir de classes appelé 'Util' qui contiennent des méthodes d'aide de n'importe quel type. Plutôt quelque chose comme MathLib dont au moins les documents de ce genre de méthode est d'être opéré.
Dans le cas d'une bibliothèque, j'ai pu sorte de voir où vous ne pouvez pas toujours avoir à faire MathLib.Sum() ou que ce soit. Peut-être que vous pourriez présenter la surcharge d'opérateur à vos types de sorte que vous pouvez effectuer des calculs sur eux avec plus de syntaxe simplifiée lors de la manipulation d'affaires de votre entreprise les objets?
J'ai peut-être un peu biaisé(grincheux) après la lecture de code VB6 au cours de la dernière quelques semaines où les méthodes globales sont tous sur la place. Cela étant dit, c'est juste mes deux cents 🙂
Avec C# 6, vous pouvez maintenant utiliser des importations (voir msdn) Par exemple,