Avatar billede codecow Nybegynder
13. maj 2005 - 15:37 Der er 16 kommentarer og
2 løsninger

overloade > og < operator for string

Hej. Det her er sikkert et noop spørgsmål, men hvordan overloader jeg
større og mindre end operatorene for string klassen, så jeg kan skrive:

if( stringA < stringB ) {
    //blah blah....
}

Jeg ved godt at jeg kan bruge "stringA.CompareTo( stringB )" men den notation bryder jeg mig ikke om.
Avatar billede arne_v Ekspert
13. maj 2005 - 18:05 #1
Det triste svar er at det gør du ikke.

String er sealed så du kan ikke extende den.
Avatar billede nielle Nybegynder
13. maj 2005 - 19:24 #2
...men så må man jo wrappe den i stedet:

using System;

namespace Eksperten
{
    class XString
    {
        private string TheString = "";

        public XString(string TheString)
        {
            this.TheString = TheString;
        }

        public override string ToString()
        {
            return TheString;
        }

        public static implicit operator XString (string TheString)
        {
            return new XString(TheString);
        }

        public static implicit operator string (XString TheXString)
        {
            // Man kan faktisk gøre sådan her:
            //
            // return TheXString.TheString;
            //
            // - det må da være en fejl når nu TheString er erklæret private?!:

            return TheXString.ToString();  // Den rigtige måde!
        }
       
        public static bool operator < (XString a, XString b)
        {
            // CompareTo returnere en int
            return (a.ToString().CompareTo(b.ToString()) > 0);
        }       
       
        public static bool operator > (XString a, XString b)
        {
            return (a.ToString().CompareTo(b.ToString()) < 0);
        }       
    }

    class App
    {
        [STAThread]
        static void Main(string[] args)
        {
            // Muligt pga. den første "implicit operator" erklæring.
            XString XStringDemo = "Eksperten er din ven.";

            // Muligt pga. den anden "implicit operator" erklæring.
            string StringDemo = XStringDemo;

            XString XStringDemo2 = "Men .NET er nu også rimeligt fedt.";

            // Hvad siger Microsoft?
            if (XStringDemo > XStringDemo2)
                Console.WriteLine("Eksperten er nu federe end .NET!");
            else
                Console.WriteLine(".NET slår Eksperten til enhver tid!");
        }
    }
}
Avatar billede arne_v Ekspert
13. maj 2005 - 19:29 #3
det kan man - men man kan ikke bruge XString hvor man skal bruge en String

(og nej det er ikke en fejl - private er i forhold til klassen ikke i forhold til
instansen)
Avatar billede codecow Nybegynder
13. maj 2005 - 19:38 #4
Hm.. ok. Så er der nok ikke andet at gøre en at bide i det sure æble og bruge CompareTo()

Er der nogen grundt til at den operator ikke er understøttet. Det er jo en gundlæggende  type i sproget, og det burde være ret tydeligt hvad man ville med den operator ?
Avatar billede codecow Nybegynder
13. maj 2005 - 19:39 #5
smid også lige et svar begge to. Og tak for hjælpen. Igen. :)
Avatar billede nielle Nybegynder
13. maj 2005 - 19:44 #6
arne_v> "det kan man - men man kan ikke bruge XString hvor man skal bruge en String" - kan du give et eksempel?

Jeg mener...

string StringDemo = XStringDemo;

- fungere jo f.eks. udemærket.
Avatar billede nielle Nybegynder
13. maj 2005 - 19:44 #7
Og et svar :^)
Avatar billede nielle Nybegynder
13. maj 2005 - 19:53 #8
arne_v> "og nej det er ikke en fejl - private er i forhold til klassen ikke i forhold til instansen"

Jae-joe, men når man skriver:

public static implicit operator string (XString TheXString)
{
    return TheXString.TheString;
}

- så er TheXString jo en instans af klassen XString, og for sådanne burde jeg jo normalt ikke kunne se fields som er erklæret private. Det var i hvert fald noget som jeg med 100% garanti ikke havde ventet (men siden at Intelli Sense nu viste det - måtte det jo prøves).
Avatar billede arne_v Ekspert
13. maj 2005 - 20:07 #9
du mangler en masse metoder i XString fordi den ikke arver fra String
Avatar billede arne_v Ekspert
13. maj 2005 - 20:09 #10
operator string er medlem af XString og har derfor adgang til private fields
Avatar billede arne_v Ekspert
13. maj 2005 - 20:09 #11
og svar
Avatar billede nielle Nybegynder
13. maj 2005 - 20:12 #12
Jeg er skam godt klar over at der mangler en ***masse*** metoder, men jeg tog dem ikke med for at kernen i det ikke skulle drukne i støj. Hvis jeg selv skulle bruge det, ville jeg implementere dem enkeltvis efterhånden som jeg fik brug for dem :^)
Avatar billede arne_v Ekspert
13. maj 2005 - 20:26 #13
Men så er der ligesom ikke så meget sjov ved det længere hvis man skal lave
alle metoderne.

implicit operator gør det meget nem at bruge men man skal være meget
opnærksom på hvad den gør

Et urealistisk men spøjset eksempel:

        public static bool ArneCompare(string s, object o)
        {
            return (s==o);
        }
        static void Main(string[] args)
        {
            XString s = "ABC";
            Console.WriteLine(ArneCompare(s,s));
        }

udskriver False fordi 1. argument ikke er s men den String som er i s
Avatar billede nielle Nybegynder
13. maj 2005 - 20:33 #14
Det er da altid sjov at kunne finde en vej rundt om MicroSofts mere eller mindre underlige beslutninger om at gøre den eller den klasse sealed. ;^)
Avatar billede arne_v Ekspert
13. maj 2005 - 20:36 #15
de er ikke ene om det

SUN har gjordt det samme med Java String
Avatar billede runesoft Nybegynder
20. maj 2005 - 14:29 #16
Hmm...  skal string1 < string2 returnere hvilken en der er længst eller hvilken en der alfabetisk kommer først (eller evt. hvilken en der er lowest case ;))?

Personligt er jeg meget varsom med operatoroverloading fordi jeg rent faktisk mener at det forvirrer mere end det gavner.
Avatar billede codecow Nybegynder
20. maj 2005 - 14:41 #17
Jeg ville mene at den skulle angive det alfabetiske forhold uden hensyn til upper- eller lowercase bogstaver, men ok.... jeg kan godt se din pointe.

Jeg syntes ihvertfald at det er irreterende at man ikke har mulighed for at overloade den. Men nu er jeg også ret glad for overloading, da jeg syntes at det giver mulighed for at lave mange ting mere tydeligt.
Avatar billede arne_v Ekspert
20. maj 2005 - 14:42 #18
alfabetisk selvfølgelig
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester