Avatar billede driis Nybegynder
03. september 2004 - 17:27 Der er 4 kommentarer og
1 løsning

Forskel på is og object::GetType()

Normalt, når jeg skal kontrollere om en variabel er af en bestemt type bruger jeg "Mulighed 2". Men fornylig så jeg i en artikel på MSDN "Mulighed 1" brugt:

protected void m(object o)
        {
            // Mulighed 1
            if ( o.GetType() == typeof(int) )
                MessageBox.Show(o.ToString() + " is an int");
            // Mulighed 2
            if ( o is int )
                MessageBox.Show(o.ToString() + " is an int");
        }

Mulighed 2 giver helt klart mest letlæselig kode, efter min mening. Men er der forskel på de 2 muligheders funktionalitet eller performance ??
Avatar billede arne_v Ekspert
03. september 2004 - 17:41 #1
Der er forskel i funktionalitet.

GetType() == typeof er et eksakt test på type. Er det præcis den her klasse.

is er et test på om den kan betragtes som.

Forskellen bliver synlig ved arv. Et object af en child type is parent typen, men
GetType er ikke lig med typeof.
Avatar billede arne_v Ekspert
03. september 2004 - 17:44 #2
Jeg vil tro at begge kan optimeres rimeligt godt af .NET runtime.

Præcis hvad der er hurtigst er svært at analysers sig frem til. Det afhænger
af implementationen. Lav en lille test.

Eller bedre skriv den kode som du bedst kan lide. Forskellen er næppe stor.
Avatar billede driis Nybegynder
03. september 2004 - 17:56 #3
Tak. Det lyder fornuftigt og efter en kort test kan jeg også se at det forholder sig sådan. Du må gerne lægge et svar.
Avatar billede driis Nybegynder
03. september 2004 - 17:57 #4
Hvis nogen er interesserede, har jeg testet arne_v's svar med flg. program:

using System;

namespace ConsoleApplication1
{
    class Test
    {
        [STAThread]
        static void Main(string[] args)
        {
            A a = new A();
            B b = new B();
            test(a);
            test(b);
        }

        public static void test(object o)
        {
            if ( o is A )
                Console.WriteLine("o is A");
           
            if ( o is B )
                Console.WriteLine("o is B");

            if ( o.GetType() == typeof(A) )
                Console.WriteLine("o.GetType() == typeof(A)");

            if ( o.GetType() == typeof(B) )
                Console.WriteLine("o.GetType() == typeof(B)");

            Console.WriteLine();
        }
    }

    class A
    {}

    class B : A
    {}
}
Avatar billede arne_v Ekspert
03. september 2004 - 18:03 #5
svar
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