2009-01-08 6 views

Répondre

0

Non, vous ne pouvez pas le faire dans une méthode d'extension. Pour réaffecter la valeur d'une variable transmise en paramètre, vous devez la transmettre par référence en utilisant le paramètre ref, ce qui n'est pas autorisé pour les méthodes d'extension. Même si cela est possible, il se peut qu'il n'y ait pas de variable à réaffecter, comme dans "foo".ConvertToLower().

3

Il y a deux façons de muter une instance de chaîne:

  • Réflexion
  • code non protégé

Je recommande de ne pas utiliser l'un d'eux. Vos collègues développeurs vous détesteront pour toujours - en particulier si la méthode est jamais utilisée pour changer une chaîne qui se trouve être un littéral ...

+0

À droite, mais je peux réaffecter une variable de chaîne. Je veux juste une méthode d'extension pour le faire pour moi. – brendanjerwin

+0

Vous ne pouvez pas faire cela. Qu'attendriez-vous si vous appeliez "Foo" .ConvertToLower()? Même si vous pouviez, je ne voudrais pas - ce serait un code très évident à lire. –

+0

Je souhaite que l'équipe .NET sépare l'instance et les méthodes statiques de manière à ce que la méthode statique retourne une nouvelle instance alors que les méthodes d'instance changeront l'original. Comme String.ToLower vs myString.ToLower() Jon, savez-vous pourquoi l'équipe .NET n'a pas suivi ce chemin? –

-3

Vous pouvez certainement écrire une méthode d'extension pour réaffecter la chaîne en cours d'exploitation. Par exemple:

public static void ConvertToLower(this string s) 
{ 
    s = s.ToLower(); 
} 

Cela n'a rien à voir avec l'immuabilité des chaînes.

+0

J'ai essayé ça, ça n'a pas marché. ' chaîne foo =" TEST "; foo.ConvertToLower(); ' foo still ==" TEST " J'ai supposé que c'était' s' était un type de valeur, passé sur la pile, pas un type de référence. Par conséquent, la réaffectation n'a rien fait en dehors de la méthode d'extension. – brendanjerwin

+0

-1: le code ne fonctionne pas. – Juliet

+0

Je suis d'accord que cela ne fonctionnera pas, mais pas parce que l'immuabilité des chaînes. Cela ne fonctionnera pas car définir la valeur d'un paramètre ne changera pas la variable réelle transmise, à moins que le paramètre ne soit passé par référence (en utilisant le mot-clé ref), ce que vous ne pouvez pas utiliser pour les méthodes d'extension. – csgero

Questions connexes