2010-08-12 6 views
0

Pour un programme que j'utilise, j'utilise object pour conserver la valeur des attributs HTML. Il y a un tas de choses que je fais avec ces valeurs dans tout le programme. Donc, je voudrais fondamentalement créer un alias pour object chaque fois qu'il est utilisé pour maintenir les valeurs des attributs HTML à quelque chose comme AttrValue juste pour rendre le programme plus clair, et pour pouvoir facilement ajouter des fonctionnalités si nécessaire. Ces objets sont utilisés sur des parties de performance critique du programme, donc je ne suis pas sûr si faire une classe au lieu d'une structure serait la meilleure idée. Quelle serait la meilleure solution ici, si la performance est la principale préoccupation (plus que la clarté)?Sous-classe Objet de C#?

+0

Connaissez-vous les interfaces et/ou l'héritage? – strager

+0

Je ne comprends pas ce que vous dites. "créer un alias pour l'objet" - qu'est-ce que cela veut dire? –

+0

@Kirk Woll, Il semble que @jsoldi veut la sécurité de type dans leur système. – strager

Répondre

2

Vous pouvez créer un alias de type using AttrValue = System.Object;. Cependant, cet alias n'existera que dans votre code source. Il n'y a rien qui vous empêche d'utiliser, par exemple, object ou string où vous avez besoin d'un AttrValue. Vous ne serez pas en mesure d'ajouter des propriétés ou des méthodes sur votre alias AttrValue: ce sera un alias pour object et non une classe à part entière.

Vous êtes probablement mieux d'introduire AttrValue en tant que classe à part entière, vraisemblablement comme un wrapper pour une valeur de type object. Il peut avoir un seul champ (de type object) et un constructeur qui prend un paramètre object. En ce qui concerne la structure par rapport à la classe, je ne m'inquiéterais pas de cela. Vous n'avez presque jamais besoin d'une structure dans le code .NET: le garbage collector est capable de gérer beaucoup d'instances de petite classe sans surcharge notable, et structs have their own oddities (principalement parce que ce qui ressemble à la même instance dans le code source peut facilement être deux copies séparées temps d'exécution).

+0

Je crois que si j'utilise 'using AttrValue = System.Object', je devrais mettre cela sur tous les fichiers dont j'ai besoin d'un objet pour avoir un alias correct? – Juan

+0

Droite - Les alias de type C# existent uniquement au niveau du code source. Dans le code compilé, vous ne verrez pas 'AttrValue', seulement' object'. –

1

Eh bien, la première question est ... Pourquoi utilisez-vous object?

HTML est du texte, et donc tous les attributs html sont des chaînes. Vous voudrez peut-être les convertir en un autre type de données (ints ou enums), mais les stocker en tant qu'objets ne va pas aider avec cela.

+0

Certains d'entre eux, comme la couleur du texte, sont traités comme des entiers dans mon programme. – Juan

+0

Ensuite, après les avoir convertis en un int, stockez-les dans un int. –

+0

mais d'autres sont des chaînes – Juan

0

Si l'héritage était un problème de performance, .NET présenterait des problèmes majeurs. L'héritage est un concept fondamental en C# et il fonctionne et fonctionne magnifiquement. Je vous suggère de créer une classe descendante et de l'utiliser.

public class HtmlAttrValue: System.Object; 

Si vous voulez vraiment, vous pouvez également créer un alias de type en C#, mais pas aussi bien que d'autres langues. Un alias de type en C# s'applique uniquement au fichier dans lequel il est défini.

using HtmlAttrValue = System.Object; 

Ceci est mal pris en charge et pas très bien connu et je ne le recommande pas. Vous pouvez également trouver plus pratique de traiter votre code HTML en XHTML (si possible) et d'utiliser certains des types et classes XML existants pour faire votre travail à votre place.

+0

Vous pouvez laisser le ': System.Object' de la déclaration de la classe car il est implicite. –

+0

OK, maintenant, si j'utilise 'public class HtmlAttrValue: System.Object {}' Comment puis-je accéder à l'objet sous-jacent? Je veux dire, si dans mon programme, maintenant je fais ceci: ' void SomeFunc (objet rawValue) { objet attrValue = rawValue; } ' comment vais-je faire cela quand' attrValue' est une instance de 'AttrValue'? Devrais-je ajouter un champ 'object' à la classe' AttrValue' même si la classe est un 'object' lui-même? – Juan