IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C# Discussion :

Rétro-analyse de System.Web.Util.StringUtil


Sujet :

C#

  1. #1
    Membre confirmé Avatar de NeoMan
    Profil pro
    Inscrit en
    Avril 2002
    Messages
    171
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2002
    Messages : 171
    Par défaut Rétro-analyse de System.Web.Util.StringUtil
    Bonjour à tous!

    Pour un projet perso, je suis en train d'implémenter un moteur de templating. L'idée est reprendre le même principe que ce qui est fait en ASP.NET. C'est pourquoi je suis en train de faire un rétro-analyse de System.Web.UI.ControlBuilder, qui utilise indirectement une classe utilitaire : System.Web.Util.StringUtil.
    Cette classe possède le code suivant (déssamblé via Reflector.Net) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
     
            internal static unsafe void UnsafeStringCopy(string src, int srcIndex, char[] dest, int destIndex, int len)
            {
                int num = len * 2;
                fixed (char* str = ((char*)src))
                {
                    char* chPtr = str;
                    fixed (char* chRef = dest)
                    {
                        byte* numPtr = (byte*)(chPtr + srcIndex);
                        byte* numPtr2 = (byte*)(chRef + destIndex);
                        memcpyimpl(numPtr, numPtr2, num);
                        str = null;
                    }
                }
            }
    Or quand j'essaye de compiler ce code, j'ai deux types d'erreur que je ne comprends pas :
    -1-
    Cannot convert type 'string' to 'char*'
    -2-
    You cannot use the fixed statement to take the address of an already fixed expression
    Avez-vous une idée pour résoudre ses erreurs ? Il y a t-il une option de compilation de type /unsafe (qui est déjà activé biensûr) ?
    Je suis assez étonné que Reflector.Net affiche un code qui ne compile pas, c'est la première fois que cela m'arrive!

    Merci d'avance de votre aide!

  2. #2
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    Citation Envoyé par NeoMan Voir le message
    Je suis assez étonné que Reflector.Net affiche un code qui ne compile pas, c'est la première fois que cela m'arrive!
    C'est pas rare pourtant... dès qu'il y a des lambdas expressions, des itérateurs ou des types anonymes, tu te retrouves avec du code qui utilise des types générés par le compilateur, avec des noms qui ne sont pas légaux en C# (avec des caractères genre "<>" par exemple). Reflector est juste un décompilateur, il ne peut pas toujours générer exactement le code d'origine...

    Pour l'instruction fixed, effectivement c'est un peu bizarre qu'il ait décompilé ça comme ça... En fait il n'y a pas besoin du cast, tu peux l'écrire comme ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    fixed (char* str = src)
    Par contre, fais attention avec ce genre de code... les chaines de caractères sont supposées etre immuables, mais dès que tu joues avec du code unsafe, il n'y a plus aucune garantie ! Par exemple la méthode suivante modifie une instance de String pour mettre la première lettre en majuscule :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    unsafe void Capitalize(string s)
    {
        fixed (char* str = s)
        {
            *str = char.ToUpper(*str);
        }
    }
     
    string s = "hello";
    Capitalize(s);
    Console.WriteLine(s); // affiche "Hello"
    (code à ne surtout pas utiliser en vrai bien sûr...)

  3. #3
    Membre confirmé Avatar de NeoMan
    Profil pro
    Inscrit en
    Avril 2002
    Messages
    171
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2002
    Messages : 171
    Par défaut
    Citation Envoyé par tomlev Voir le message
    C'est pas rare pourtant... dès qu'il y a des lambdas expressions, des itérateurs ou des types anonymes, tu te retrouves avec du code qui utilise des types générés par le compilateur, avec des noms qui ne sont pas légaux en C# (avec des caractères genre "<>" par exemple).
    Oui... C'est vrai que je ne pensais pas à ce genre de cas. Mais là c'est plus compéhensible... L'instruction fixed est une instruction "de base", j'étais surpris qu'il ne sache pas ce débrouillé mieux ça avec...

    pour revenir au cast. Je ne savais pas qu'en C# un string était directement assimilable à un char*. Pourtant c'est bien le cas et C/C++...
    Merci pour tes explications !

    @+

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [MVC] JstLview -> org.springframework.web.util.NestedServletException
    Par Invité dans le forum Spring Web
    Réponses: 2
    Dernier message: 11/08/2009, 18h42
  2. Réponses: 5
    Dernier message: 24/11/2006, 20h49
  3. [C# 2.0] Comment hériter de System.Web.UI.Page ?
    Par dymezac dans le forum ASP.NET
    Réponses: 3
    Dernier message: 31/10/2006, 09h08
  4. Analyse des log web
    Par cjacquel dans le forum Statistiques
    Réponses: 1
    Dernier message: 10/04/2006, 22h46
  5. [C#] System.Web.Mail
    Par Landolsi dans le forum C#
    Réponses: 13
    Dernier message: 11/11/2005, 14h24

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo