2010-11-09 4 views
1

J'ai croisé du code lors d'une révision de code qui ne me semblait pas correcte, mais je ne suis pas sûr du "meilleur" moyen de le changer. Dans la recherche d'une réponse que je trouve which is better, using a nullable or a boolean return+out parameter et Which is better, return value or out parameter? Ce dernier avait une réponse à ce commentaire que je suis généralement d'accord avec:Valeur de retour ou paramètre de sortie pour la méthode C# pouvant renvoyer un caractère ou une chaîne?

Si vous vous trouvez avoir besoin de retourner deux choses d'une API puis les envelopper dans un struct/classe serait mieux qu'un hors param. »

Voici un échantillon représentatif du code en question. Il fait partie d'une application web et des boucles essentiellement à travers un tampon de caractère et veut traduire « caractères non imprimables » à Pour ce faire, l'auteur de la méthode Translate renvoie toujours une chaîne et l'appelant doit revenir à un tableau de caractères.

string character = Translate(value); 
if (character.Length == 1) { 
    writer.Write(character[0]); 
} else { 
    writer.Write(character.ToCharArray()); 
} 

public string Translate(char value) { 
    if (value <= '\u017F') { 
     return value.ToString(); 
    } 

    switch (value) { 
     case '\u2117': 
      return '\u00A9'.ToString(); // copyright sign 
     case '\u211E': 
      return "Rx"; // prescription 
     // ... and lots more case statements 
    } 

    return value.ToString(); 
} 

Il me semblait que j'avais quelques options. Dois-je faire en sorte que l'appelant déduise quel char ou quelle chaîne utiliser en fonction des valeurs null ou String.Empty, ou être explicite avec un booléen out? Je ne veux pas créer de nouvelle instance et renvoyer une instance d'objet tuple pour chaque caractère passant par cette fonction, car cela semble être une surcharge de création d'objet et une future récupération de place.

public string Translate(char value, out char newValue) 
public void Translate(char value, out char? newCharValue, out string newStringValue) 
public void Translate(char value, out bool useChar, out char newCharValue, out string newStringValue) 

Répondre

4

Qu'en est-il toujours retourner une chaîne (de longueur 0, 1, ou plusieurs), et appelant toujours writer.Write(string)?

+0

Parce qu'il crée une nouvelle chaîne pour chaque caractère de la mémoire tampon. Si je produis 10 000 caractères, est-ce que je veux que ma méthode crée 10 000 objets string? –

+1

Je ne vois pas le "nouveau" mot-clé utilisé sur * strings * dans votre exemple de code. l'avez-vous testé? Est-ce que cela arrive vraiment? Je pense que vous trouverez que les littéraux de chaîne que vous déclarez dans votre commutateur géant sont internés. D'un autre côté (et cela ne fait que spéculer, vous devez TOUJOURS profiler), vous voulez probablement rester loin des tableaux de caractères car ils n'ont pas une telle optimisation. –

0

Est-ce que vous prévoyez d'utiliser cette méthode Translate n'importe où, ou est-ce qu'elle sera toujours utilisée pour écrire les données d'un flux dans un autre? Que diriez-vous de passer l'écrivain à la méthode Translate, et de le laisser appeler la méthode appropriée writer.Write?

1

Si vous renvoyez une chaîne, pourquoi ne pas utiliser "\ u00A9" au lieu de "\ u00A9'.ToString()?

+0

Oui, cela permettrait de mieux profiter de l'internalisation de chaînes. +1 –

Questions connexes