97 votes

Comment étendre les types intégrés de C#, comme String ?

Bonjour à tous... J'ai besoin de Trim a String . Mais je veux supprimer tous les espaces vides répétés dans la chaîne elle-même, et pas seulement à la fin ou au début de celle-ci. Je pourrais le faire avec une méthode comme :

public static string ConvertWhitespacesToSingleSpaces(string value)
{
    value = Regex.Replace(value, @"\s+", " ");
}

Ce que j'ai obtenu de aquí . Mais je veux que ce morceau de code soit appelé à l'intérieur de l'élément String.Trim() lui-même, donc je pense que je dois étendre ou surcharger ou surcharger la fonction Trim méthode... Y a-t-il un moyen de faire cela ?

Merci d'avance.

178voto

JoeyRobichaud Points 1111

Comme il n'est pas possible d'étendre les string.Trim() . Vous pouvez créer une méthode d'extension telle que décrite aquí qui réduit les espaces blancs.

namespace CustomExtensions
{
    //Extension methods must be defined in a static class
    public static class StringExtension
    {
        // This is the extension method.
        // The first parameter takes the "this" modifier
        // and specifies the type for which the method is defined.
        public static string TrimAndReduce(this string str)
        {
            return ConvertWhitespacesToSingleSpaces(str).Trim();
        }

        public static string ConvertWhitespacesToSingleSpaces(this string value)
        {
            return Regex.Replace(value, @"\s+", " ");
        }
    }
}

Vous pouvez l'utiliser comme suit

using CustomExtensions;

string text = "  I'm    wearing the   cheese.  It isn't wearing me!   ";
text = text.TrimAndReduce();

Vous donne

text = "I'm wearing the cheese. It isn't wearing me!";

0 votes

Le fichier a-t-il besoin d'un nom particulier ? Ou bien où le sauvegarder ? Peut-on le placer dans une classe Util ou quelque chose comme ça ?

1 votes

@testing Vous pouvez les placer n'importe où tant qu'ils sont référencés dans votre projet. Si vous les placez dans un espace de noms spécifique, il suffit de les intégrer avec une instruction "using" comme n'importe quelle autre classe.

0 votes

Pourquoi n'avez-vous pas renvoyé la regex directement depuis la fonction TrimAndReduce ? cela aurait rendu votre réponse beaucoup plus simple à lire. A moins que vous n'utilisiez tellement votre réponse que vous ayez besoin de l'appeler ailleurs LOL

24voto

Henk Holterman Points 153608

Est-ce possible ? Oui, mais seulement avec une méthode d'extension

La classe System.String est scellé, vous ne pouvez donc pas utiliser la surcharge ou l'héritage.

public static class MyStringExtensions
{
  public static string ConvertWhitespacesToSingleSpaces(this string value)
  {
    return Regex.Replace(value, @"\s+", " ");
  }
}

// usage: 
string s = "test   !";
s = s.ConvertWhitespacesToSingleSpaces();

6 votes

Pour être clair, non, il n'est pas possible de modifier les actions qui String.Trim prendre.

11voto

Arne Points 515

Il y a un oui et un non à votre question.

Oui, vous pouvez étendre les types existants en utilisant des méthodes d'extension. Bien entendu, les méthodes d'extension ne peuvent accéder qu'à l'interface publique du type.

public static string ConvertWhitespacesToSingleSpaces(this string value) {...}

// some time later...
"hello world".ConvertWhitespacesToSingleSpaces()

Non, vous ne pouvez pas appeler cette méthode Trim() . Les méthodes d'extension ne participent pas à la surcharge. Je pense qu'un compilateur devrait même vous donner un message d'erreur détaillant cela.

Les méthodes d'extension ne sont visibles que si l'espace de noms contenant le type qui définit la méthode est utilisé.

7voto

Corey Sunwold Points 6330

Méthodes d'extension !

public static class MyExtensions
{
    public static string ConvertWhitespacesToSingleSpaces(this string value)
    {
        return Regex.Replace(value, @"\s+", " ");
    }
}

2voto

Outre l'utilisation de méthodes d'extension -- probablement un bon candidat ici -- il est également possible d'"envelopper" un objet (par exemple, la "composition d'objets"). Tant que la forme enveloppée ne contient pas plus d'informations que la chose enveloppée, l'élément enveloppé peut être proprement passé à travers des conversions implicites ou explicites sans perte d'informations : juste un changement de type/interface.

Bon codage.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X