Pemeriksaan Ketik: typeof, GetType, atau?

Saya telah melihat banyak orang menggunakan kode berikut:

Type t = typeof(obj1);
if (t == typeof(int))
    // Some code here

Tapi saya tahu Anda juga bisa melakukan ini:

if (obj1.GetType() == typeof(int))
    // Some code here

Atau ini:

if (obj1 is int)
    // Some code here

Secara pribadi, saya merasa yang terakhir adalah yang terbersih, tetapi apakah ada sesuatu yang saya lewatkan? Mana yang terbaik untuk digunakan, atau preferensi pribadi?


person jasonh    schedule 11.06.2009    source sumber
comment
Jangan lupa as!   -  person RCIX    schedule 08.10.2009
comment
as tidak benar-benar memeriksa tipe...   -  person jasonh    schedule 08.10.2009
comment
as tentu saja merupakan bentuk pengecekan tipe, sama seperti is! Ini secara efektif menggunakan is di belakang layar, dan digunakan di semua tempat di MSDN di mana ia meningkatkan kebersihan kode dibandingkan is. Daripada memeriksa is terlebih dahulu, panggilan ke as membuat variabel yang diketik siap digunakan: Jika nilainya nol, tanggapi dengan tepat; jika tidak, lanjutkan. Tentu saja sesuatu yang sering saya lihat dan gunakan.   -  person Zaccone    schedule 20.08.2014
comment
Ada perbedaan kinerja yang signifikan dalam mendukung as/is (dibahas dalam stackoverflow.com/a/27813381/477420) dengan asumsi semantik berfungsi untuk kasus Anda.   -  person Alexei Levenkov    schedule 07.01.2015
comment
@samusarin tidak menggunakan refleksi. Metode GetType yang Anda tautkan ada di System.Reflection.Assembly -- metode yang sama sekali berbeda dan tidak relevan di sini.   -  person Kirk Woll    schedule 11.08.2017
comment
Saya pikir typeof(obj1) adalah kesalahan sintaksis. Saya pikir yang Anda maksud adalah Type t = obj1.GetType();   -  person LongChalk    schedule 12.03.2019
comment
Saya pikir apa yang dimaksud RCIC adalah bahwa pemeriksaan tipe biasanya diikuti oleh cast dan dalam kasus seperti itu, pemeriksaan tipe (yaitu) dapat disimpan: var castedType = otherType as CastedType; if (castedType != null) { lanjutkan dengan menggunakan objek bertipe CastedType };   -  person user3285954    schedule 15.03.2020


Jawaban (14)


Semuanya berbeda.

  • typeof mengambil nama tipe (yang Anda tentukan pada waktu kompilasi).
  • GetType mendapatkan tipe runtime dari sebuah instance.
  • is mengembalikan nilai true jika sebuah instance ada di pohon warisan.

Contoh

class Animal { } 
class Dog : Animal { }

void PrintTypes(Animal a) { 
    Console.WriteLine(a.GetType() == typeof(Animal)); // false 
    Console.WriteLine(a is Animal);                   // true 
    Console.WriteLine(a.GetType() == typeof(Dog));    // true
    Console.WriteLine(a is Dog);                      // true 
}

Dog spot = new Dog(); 
PrintTypes(spot);

Bagaimana dengan typeof(T)? Apakah ini juga teratasi pada waktu kompilasi?

Ya. T selalu sesuai dengan jenis ekspresinya. Ingat, metode generik pada dasarnya adalah sekumpulan metode dengan tipe yang sesuai. Contoh:

string Foo<T>(T parameter) { return typeof(T).Name; }

Animal probably_a_dog = new Dog();
Dog    definitely_a_dog = new Dog();

Foo(probably_a_dog); // this calls Foo<Animal> and returns "Animal"
Foo<Animal>(probably_a_dog); // this is exactly the same as above
Foo<Dog>(probably_a_dog); // !!! This will not compile. The parameter expects a Dog, you cannot pass in an Animal.

Foo(definitely_a_dog); // this calls Foo<Dog> and returns "Dog"
Foo<Dog>(definitely_a_dog); // this is exactly the same as above.
Foo<Animal>(definitely_a_dog); // this calls Foo<Animal> and returns "Animal". 
Foo((Animal)definitely_a_dog); // this does the same as above, returns "Animal"
person Jimmy    schedule 11.06.2009
comment
Ah, jadi jika saya memiliki kelas Ford yang berasal dari Car dan turunan dari Ford, pengecekan Car pada instance itu akan benar. Masuk akal! - person jasonh; 11.06.2009
comment
Untuk memperjelas, saya menyadarinya, tetapi saya berkomentar sebelum Anda menambahkan contoh kode. Saya ingin mencoba menambahkan kejelasan bahasa Inggris pada jawaban Anda yang sudah sangat bagus. - person jasonh; 11.06.2009
comment
@Shimmy jika typeof dievaluasi pada waktu kompilasi dan GetType() dievaluasi saat runtime, maka masuk akal jika GetType() menimbulkan sedikit penurunan kinerja - person Cedric Mamo; 10.12.2012
comment
bagaimana dengan new Dog().GetType() is Animal Atau typeof(Dog) is Animal , itu hanya memberikan peringatan dan bukan kesalahan? - person Prerak K; 07.05.2014
comment
@PrerakK new Dog().GetType() is Animal mengembalikan false (dan versi Anda yang lain juga) karena .GetType() mengembalikan objek bertipe Type, dan Type bukan Animal. - person Maarten; 07.11.2014
comment
Secara umum, saat Anda menggunakan is, jika hasilnya (baik true atau false) diketahui pada waktu kompilasi, Anda akan mendapat peringatan pada waktu kompilasi. Ini berarti Anda harus mengubah kode Anda! Contoh 1: void M(Dog d) { var test = d is System.Exception; } Dapat dilihat pada waktu kompilasi bahwa referensi nol atau turunan dari Dog tidak akan pernah menjadi turunan dari System.Exception karena tipe yang terlibat adalah tipe class dan masing-masing class hanya dapat memiliki satu kelas dasar langsung. Contoh 2: void M(int i) { var test = i is IConvertible; } Dapat dilihat pada waktu kompilasi bahwa ini selalu benar (i tidak pernah nol). - person Jeppe Stig Nielsen; 10.01.2017
comment
Saya melihat contoh Anda berfungsi tetapi tampaknya gagal ketika warisannya adalah Objek ke Int32... Parameternya adalah Objek, saya menanyakan parameternya adalah Int32 = false, itu seharusnya benar. - person Yogurtu; 09.01.2018
comment
Hai @Yogurtu, test(Object o) { return o is Int32; } akan mengembalikan nilai true untuk test(10). - person Jimmy; 09.01.2018
comment
Topik Refleksi dan metode yang digunakan sangat berguna dan pada saat yang sama agak rumit serta memerlukan lebih banyak studi dan kerja di bidang ini. - person elnaz jangi; 12.06.2020

Gunakan typeof bila Anda ingin mendapatkan tipenya pada waktu kompilasi. Gunakan GetType bila Anda ingin mendapatkan tipe pada waktu eksekusi. Jarang ada kasus untuk menggunakan is seperti halnya cast dan, dalam banyak kasus, Anda tetap melakukan casting variabel.

Ada opsi keempat yang belum Anda pertimbangkan (terutama jika Anda juga akan melemparkan objek ke tipe yang Anda temukan); yaitu menggunakan as.

Foo foo = obj as Foo;

if (foo != null)
    // your code here

Ini hanya menggunakan satu pemeran sedangkan pendekatan ini:

if (obj is Foo)
    Foo foo = (Foo)obj;

membutuhkan dua.

Pembaruan (Jan 2020):

  • Mulai C# 7+, Anda kini dapat melakukan cast inline, sehingga pendekatan 'is' kini dapat dilakukan dalam satu cast juga.

Contoh:

if(obj is Foo newLocalFoo)
{
    // For example, you can now reference 'newLocalFoo' in this local scope
    Console.WriteLine(newLocalFoo);
}
person Andrew Hare    schedule 11.06.2009
comment
Dengan perubahan di .NET 4 apakah is masih melakukan cast? - person ahsteele; 22.03.2013
comment
Apakah jawaban ini benar? Apakah benar Anda benar-benar dapat meneruskan sebuah instance ke typeof()? Pengalaman saya Tidak. Tapi saya rasa secara umum benar bahwa pemeriksaan suatu instance mungkin harus dilakukan pada saat runtime, sedangkan pemeriksaan kelas harus dapat dilakukan pada waktu kompilasi. - person Jon Coombs; 08.10.2013
comment
@jon (4 tahun setelah q.), tidak, Anda tidak dapat meneruskan sebuah instance ke typeof(), dan jawaban ini tidak menyarankan Anda bisa. Anda meneruskan tipenya, yaitu, typeof(string) berfungsi, typeof("foo") tidak. - person Abel; 20.09.2017
comment
Saya tidak percaya is melakukan operasi seperti itu, melainkan operasi khusus di IL. - person abatishchev; 22.10.2018
comment
Sekarang kita dapat melakukan if (obj is Foo foo) { /* use foo here */ } - person Ivan García Topete; 17.04.2019
comment
Jarang ada kasus yang digunakan seperti halnya cast dan, dalam kebanyakan kasus, Anda tetap melakukan casting variabel. - Sebenarnya ada kasus penggunaan yang sangat valid. Lihat jawaban JoelC. Anda dapat menggunakannya untuk mengetik dan memasukkan inline. Ini sangat rapi. Tentu saja ini hanya tersedia di C#7 ke atas, saya yakin. - person Colm Bhandal; 14.08.2019

1.

Type t = typeof(obj1);
if (t == typeof(int))

Ini ilegal, karena typeof hanya bekerja pada tipe, bukan pada variabel. Saya berasumsi obj1 adalah variabel. Jadi, dengan cara ini typeof bersifat statis, dan melakukan tugasnya pada waktu kompilasi, bukan pada waktu proses.

2.

if (obj1.GetType() == typeof(int))

Ini adalah true jika obj1 persis bertipe int. Jika obj1 berasal dari int, kondisi ifnya adalah false.

3.

if (obj1 is int)

Ini adalah true jika obj1 adalah int, atau jika ia berasal dari kelas bernama int, atau jika ia mengimplementasikan antarmuka bernama int.

person Scott Langham    schedule 11.06.2009
comment
Berpikir tentang 1, Anda benar. Namun, saya telah melihatnya di beberapa contoh kode di sini. Seharusnya Tipe t = obj1.GetType(); - person jasonh; 11.06.2009
comment
Ya, menurutku begitu. typeof(obj1) tidak dapat dikompilasi ketika saya mencobanya. - person Scott Langham; 11.06.2009
comment
Tidak mungkin untuk memperoleh dari System.Int32 atau tipe nilai lainnya di C# - person reggaeguitar; 04.12.2014
comment
dapatkah Anda memberi tahu apa yang akan menjadi typeof(typeof(system.int32)) - person Sana; 27.06.2018
comment
@Sana, kenapa Anda tidak mencobanya :) Saya akan membayangkan Anda mendapatkan kembali sebuah instance System.Type yang mewakili tipe System.Type! Dokumentasi untuk typeof ada di sini: docs.microsoft.com/ en-us/dotnet/csharp/bahasa-referensi/ - person Scott Langham; 02.07.2018

Type t = typeof(obj1);
if (t == typeof(int))
    // Some code here

Ini adalah sebuah kesalahan. Operator typeof di C# hanya dapat mengambil nama tipe, bukan objek.

if (obj1.GetType() == typeof(int))
    // Some code here

Ini akan berhasil, tapi mungkin tidak seperti yang Anda harapkan. Untuk tipe nilai, seperti yang Anda tunjukkan di sini, nilai tersebut dapat diterima, namun untuk tipe referensi, nilai tersebut hanya akan menghasilkan nilai true jika tipe tersebut adalah tipe yang sama persis, bukan tipe lain dalam hierarki pewarisan. Contohnya:

class Animal{}
class Dog : Animal{}

static void Foo(){
    object o = new Dog();

    if(o.GetType() == typeof(Animal))
        Console.WriteLine("o is an animal");
    Console.WriteLine("o is something else");
}

Ini akan mencetak "o is something else", karena tipe o adalah Dog, bukan Animal. Namun Anda dapat membuat ini berfungsi jika Anda menggunakan metode IsAssignableFrom dari kelas Type.

if(typeof(Animal).IsAssignableFrom(o.GetType())) // note use of tested type
    Console.WriteLine("o is an animal");

Namun teknik ini masih menyisakan masalah besar. Jika variabel Anda null, panggilan ke GetType() akan memunculkan NullReferenceException. Jadi untuk membuatnya berfungsi dengan benar, Anda harus melakukan:

if(o != null && typeof(Animal).IsAssignableFrom(o.GetType()))
    Console.WriteLine("o is an animal");

Dengan ini, Anda memiliki perilaku yang setara dengan kata kunci is. Oleh karena itu, jika ini adalah perilaku yang Anda inginkan, Anda harus menggunakan kata kunci is, yang lebih mudah dibaca dan efisien.

if(o is Animal)
    Console.WriteLine("o is an animal");

Namun dalam kebanyakan kasus, kata kunci is masih belum sesuai dengan keinginan Anda, karena biasanya tidak cukup hanya dengan mengetahui bahwa suatu objek bertipe tertentu. Biasanya, Anda ingin menggunakan objek tersebut sebagai turunan dari tipe tersebut, sehingga memerlukan casting juga. Jadi Anda mungkin mendapati diri Anda menulis kode seperti ini:

if(o is Animal)
    ((Animal)o).Speak();

Namun hal itu membuat CLR memeriksa tipe objek hingga dua kali. Ia akan memeriksanya sekali untuk memenuhi operator is, dan jika o memang Animal, kami memeriksanya lagi untuk memvalidasi pemerannya.

Lebih efisien melakukan ini:

Animal a = o as Animal;
if(a != null)
    a.Speak();

Operator as adalah pemeran yang tidak akan mengeluarkan pengecualian jika gagal, melainkan mengembalikan null. Dengan cara ini, CLR memeriksa tipe objek sekali saja, dan setelah itu, kita hanya perlu melakukan pemeriksaan null, yang mana lebih efisien.

Namun hati-hati: banyak orang terjebak dengan as. Karena tidak memberikan pengecualian, beberapa orang menganggapnya sebagai gips yang "aman", dan mereka menggunakannya secara eksklusif, menghindari gips biasa. Hal ini menyebabkan kesalahan seperti ini:

(o as Animal).Speak();

Dalam hal ini, pengembang dengan jelas berasumsi bahwa o akan selalu menjadi Animal, dan selama asumsi mereka benar, semuanya berfungsi dengan baik. Namun jika mereka salah, maka yang mereka dapatkan di sini adalah NullReferenceException. Dengan pemeran reguler, mereka akan mendapatkan InvalidCastException, yang akan mengidentifikasi masalahnya dengan lebih tepat.

Terkadang, bug ini sulit ditemukan:

class Foo{
    readonly Animal animal;

    public Foo(object o){
        animal = o as Animal;
    }

    public void Interact(){
        animal.Speak();
    }
}

Ini adalah kasus lain di mana pengembang dengan jelas mengharapkan o menjadi Animal setiap saat, namun hal ini tidak terlihat jelas di konstruktor, tempat pemeran as digunakan. Ini tidak jelas sampai Anda mendapatkan metode Interact, di mana bidang animal diharapkan ditetapkan secara positif. Dalam kasus ini, Anda tidak hanya akan mendapatkan pengecualian yang menyesatkan, namun pengecualian tersebut juga tidak akan muncul hingga kemungkinan terjadi lebih lama dibandingkan saat kesalahan sebenarnya terjadi.

Kesimpulan:

  • Jika Anda hanya perlu mengetahui apakah suatu objek bertipe tertentu atau tidak, gunakan is.

  • Jika Anda perlu memperlakukan suatu objek sebagai turunan dari tipe tertentu, tetapi Anda tidak tahu pasti apakah objek tersebut akan bertipe tersebut, gunakan as dan periksa null.

  • Jika Anda perlu memperlakukan suatu objek sebagai turunan dari tipe tertentu, dan objek tersebut seharusnya bertipe tersebut, gunakan cast biasa.

person P Daddy    schedule 11.06.2009
comment
apa yang salah dengan if(o is Animal) ((Animal)o).Speak(); ? bisakah Anda memberikan rincian lebih lanjut? - person Emil; 11.01.2017
comment
@batmaci: ada di jawabannya -- ini menyebabkan dua pemeriksaan jenis. Yang pertama adalah o is Animal, yang mengharuskan CLR untuk memeriksa apakah tipe variabel o adalah Animal. Kali kedua pemeriksaannya adalah saat memasukkan pernyataan ((Animal)o).Speak(). Daripada memeriksa dua kali, periksa sekali menggunakan as. - person siride; 28.07.2018
comment
Saya menemukan ini penjelasan yang sangat bagus, terima kasih telah mengklarifikasi! - person Paul Efford; 29.11.2019

Jika Anda menggunakan C# 7, maka inilah saatnya memperbarui jawaban hebat Andrew Hare. Pencocokan pola telah memperkenalkan pintasan bagus yang memberi kita variabel yang diketik dalam konteks pernyataan if, tanpa memerlukan deklarasi/pemeran terpisah dan periksa:

if (obj1 is int integerValue)
{
    integerValue++;
}

Ini terlihat sangat mengecewakan untuk pemeran tunggal seperti ini, tetapi benar-benar bersinar ketika Anda memiliki banyak kemungkinan tipe yang masuk ke dalam rutinitas Anda. Di bawah ini adalah cara lama untuk menghindari casting dua kali:

Button button = obj1 as Button;
if (button != null)
{
    // do stuff...
    return;
}
TextBox text = obj1 as TextBox;
if (text != null)
{
    // do stuff...
    return;
}
Label label = obj1 as Label;
if (label != null)
{
    // do stuff...
    return;
}
// ... and so on

Mengatasi penyusutan kode ini sebanyak mungkin, serta menghindari duplikat objek yang sama selalu mengganggu saya. Di atas dikompresi dengan baik dengan pencocokan pola sebagai berikut:

switch (obj1)
{
    case Button button:
        // do stuff...
        break;
    case TextBox text:
        // do stuff...
        break;
    case Label label:
        // do stuff...
        break;
    // and so on...
}

EDIT: Memperbarui metode baru yang lebih panjang untuk menggunakan saklar sesuai komentar Palec.

person JoelC    schedule 01.02.2018

Saya memiliki properti Type untuk dibandingkan dan tidak dapat menggunakan is (seperti my_type is _BaseTypetoLookFor), tetapi saya dapat menggunakan ini:

base_type.IsInstanceOfType(derived_object);
base_type.IsAssignableFrom(derived_type);
derived_type.IsSubClassOf(base_type);

Perhatikan bahwa IsInstanceOfType dan IsAssignableFrom mengembalikan true ketika membandingkan tipe yang sama, dengan IsSubClassOf akan mengembalikan false. Dan IsSubclassOf tidak berfungsi pada antarmuka, seperti dua antarmuka lainnya. (Lihat juga pertanyaan dan jawaban ini.)

public class Animal {}
public interface ITrainable {}
public class Dog : Animal, ITrainable{}

Animal dog = new Dog();

typeof(Animal).IsInstanceOfType(dog);     // true
typeof(Dog).IsInstanceOfType(dog);        // true
typeof(ITrainable).IsInstanceOfType(dog); // true

typeof(Animal).IsAssignableFrom(dog.GetType());      // true
typeof(Dog).IsAssignableFrom(dog.GetType());         // true
typeof(ITrainable).IsAssignableFrom(dog.GetType()); // true

dog.GetType().IsSubclassOf(typeof(Animal));            // true
dog.GetType().IsSubclassOf(typeof(Dog));               // false
dog.GetType().IsSubclassOf(typeof(ITrainable)); // false
person Yahoo Serious    schedule 15.05.2012

Saya lebih suka adalah

Oleh karena itu, jika Anda menggunakan is, kemungkinan besar Anda tidak menggunakan warisan dengan benar.

Asumsikan Orang : Entitas, dan Hewan : Entitas. Umpan adalah metode virtual di Entitas (untuk membuat Neil senang)

class Person
{
  // A Person should be able to Feed
  // another Entity, but they way he feeds
  // each is different
  public override void Feed( Entity e )
  {
    if( e is Person )
    {
      // feed me
    }
    else if( e is Animal )
    {
      // ruff
    }
  }
}

Lebih tepatnya

class Person
{
  public override void Feed( Person p )
  {
    // feed the person
  }
  public override void Feed( Animal a )
  {
    // feed the animal
  }
}
person bobobobo    schedule 11.06.2009
comment
Benar, saya tidak akan pernah melakukan yang pertama, mengetahui bahwa Pribadi berasal dari Hewan. - person jasonh; 11.06.2009
comment
Yang terakhir juga tidak menggunakan warisan. Foo harus menjadi metode virtual Entitas yang ditimpa di Person dan Animal. - person Neil Williams; 11.06.2009
comment
@bobobobo Saya rasa yang Anda maksud adalah kelebihan beban, bukan warisan. - person lc.; 11.06.2009
comment
@lc: Tidak, maksud saya warisan. Contoh pertama adalah cara yang salah (menggunakan is) untuk mendapatkan perilaku yang berbeda. Contoh kedua menggunakan kelebihan beban ya, namun menghindari penggunaan is. - person bobobobo; 11.06.2009
comment
Poin bagusnya adalah menggunakan kata kunci 'adalah' umumnya merupakan pilihan desain yang buruk. Namun solusi yang diberikan tidak memperbaiki desain, hanya mengubah cara penerapannya. - person ebrown; 12.06.2009
comment
Masalah dengan contoh ini adalah bahwa contoh tersebut tidak dapat diskalakan. Jika Anda menambahkan entitas baru yang perlu dimakan (misalnya Serangga atau Monster), Anda perlu menambahkan metode baru di kelas Entitas dan kemudian menggantinya di subkelas yang akan memberinya makan. Ini tidak lebih disukai daripada daftar if (entitas adalah X) else if (entitas adalah Y)... Ini melanggar LSP dan OCP, pewarisan mungkin bukan solusi terbaik untuk masalah ini. Beberapa bentuk delegasi mungkin lebih disukai. - person ebrown; 12.06.2009

Saya percaya yang terakhir juga melihat warisan (misalnya Anjing adalah Hewan == benar), yang lebih baik dalam banyak kasus.

person StriplingWarrior    schedule 11.06.2009

Itu tergantung pada apa yang saya lakukan. Jika saya memerlukan nilai bool (misalnya, untuk menentukan apakah saya akan menggunakan int), saya akan menggunakan is. Jika saya benar-benar membutuhkan tipe tersebut karena alasan tertentu (misalnya, untuk meneruskan ke metode lain), saya akan menggunakan GetType().

person AllenG    schedule 11.06.2009
comment
Poin bagus. Saya lupa menyebutkan bahwa saya mendapatkan pertanyaan ini setelah melihat beberapa jawaban yang menggunakan pernyataan if untuk memeriksa suatu jenis. - person jasonh; 11.06.2009

Yang terakhir lebih bersih, lebih jelas, dan juga memeriksa subtipe. Yang lain tidak memeriksa polimorfisme.

person thecoop    schedule 11.06.2009

Digunakan untuk mendapatkan objek System.Type untuk suatu tipe. Ekspresi typeof mengambil bentuk berikut:

System.Type type = typeof(int);

Example:

    public class ExampleClass
    {
       public int sampleMember;
       public void SampleMethod() {}

       static void Main()
       {
          Type t = typeof(ExampleClass);
          // Alternatively, you could use
          // ExampleClass obj = new ExampleClass();
          // Type t = obj.GetType();

          Console.WriteLine("Methods:");
          System.Reflection.MethodInfo[] methodInfo = t.GetMethods();

          foreach (System.Reflection.MethodInfo mInfo in methodInfo)
             Console.WriteLine(mInfo.ToString());

          Console.WriteLine("Members:");
          System.Reflection.MemberInfo[] memberInfo = t.GetMembers();

          foreach (System.Reflection.MemberInfo mInfo in memberInfo)
             Console.WriteLine(mInfo.ToString());
       }
    }
    /*
     Output:
        Methods:
        Void SampleMethod()
        System.String ToString()
        Boolean Equals(System.Object)
        Int32 GetHashCode()
        System.Type GetType()
        Members:
        Void SampleMethod()
        System.String ToString()
        Boolean Equals(System.Object)
        Int32 GetHashCode()
        System.Type GetType()
        Void .ctor()
        Int32 sampleMember
    */

Sampel ini menggunakan metode GetType untuk menentukan tipe yang digunakan untuk memuat hasil perhitungan numerik. Hal ini tergantung pada kebutuhan penyimpanan nomor yang dihasilkan.

    class GetTypeTest
    {
        static void Main()
        {
            int radius = 3;
            Console.WriteLine("Area = {0}", radius * radius * Math.PI);
            Console.WriteLine("The type is {0}",
                              (radius * radius * Math.PI).GetType()
            );
        }
    }
    /*
    Output:
    Area = 28.2743338823081
    The type is System.Double
    */
person Muhammad Awais    schedule 14.04.2016

Anda dapat menggunakan operator "typeof()" di C# tetapi Anda perlu memanggil namespace menggunakan System.IO; Anda harus menggunakan kata kunci "is" jika Anda ingin memeriksa jenisnya.

person androidrill    schedule 03.04.2014
comment
typeof tidak didefinisikan dalam namespace, itu adalah kata kunci. System.IO tidak ada hubungannya dengan ini. - person Arturo Torres Sánchez; 18.09.2015

Uji kinerja typeof() vs GetType():

using System;
namespace ConsoleApplication1
    {
    class Program
    {
        enum TestEnum { E1, E2, E3 }
        static void Main(string[] args)
        {
            {
                var start = DateTime.UtcNow;
                for (var i = 0; i < 1000000000; i++)
                    Test1(TestEnum.E2);
                Console.WriteLine(DateTime.UtcNow - start);
            }
            {
                var start = DateTime.UtcNow;
                for (var i = 0; i < 1000000000; i++)
                    Test2(TestEnum.E2);
                Console.WriteLine(DateTime.UtcNow - start);
            }
            Console.ReadLine();
        }
        static Type Test1<T>(T value) => typeof(T);
        static Type Test2(object value) => value.GetType();
    }
}

Hasil dalam mode debug:

00:00:08.4096636
00:00:10.8570657

Hasil dalam mode rilis:

00:00:02.3799048
00:00:07.1797128
person Alexander Vasilyev    schedule 03.08.2015
comment
Seseorang tidak boleh menggunakan DateTime.UtcNow untuk mengukur kinerja. Dengan kode Anda tetapi dengan kelas Stopwatch saya terus-menerus mendapatkan hasil yang berlawanan untuk mode Debug. UseTypeOf: 00:00:14.5074469 UseGetType: 00:00:10.5799534 . Mode rilisnya sama, seperti yang diharapkan - person Alexey Shcherbak; 25.11.2015
comment
@AlexeyShcherbak Perbedaan antara Stopwatch dan DateTime.Sekarang tidak boleh lebih dari 10-20 ms, periksa kembali kode Anda. Dan saya tidak peduli dengan milidetik dalam pengujian saya. Juga kode saya akan menjadi beberapa baris kode lebih panjang dengan Stopwatch. - person Alexander Vasilyev; 25.11.2015
comment
ini praktik buruk secara umum, bukan dalam kasus khusus Anda. - person Alexey Shcherbak; 25.11.2015
comment
@AlexanderVasilyev Jumlah baris kode tidak boleh digunakan sebagai argumen untuk melakukan sesuatu yang didokumentasikan menyesatkan. Seperti yang terlihat di msdn.microsoft.com/ en-us/library/system.datetime(v=vs.110).aspx, DateTime tidak boleh digunakan jika Anda mengkhawatirkan waktu di bawah 100 md, karena menggunakan OS jangka waktu. Dibandingkan dengan Stopwatch, yang menggunakan prosesor Tick, resolusi yang digunakan oleh DateTime di Win7 adalah 15ms. - person Eric Wu; 06.03.2016

person    schedule
comment
Silakan edit dengan informasi lebih lanjut. Hanya kode dan jawaban coba ini tidak disarankan, karena tidak mengandung konten yang dapat dicari, dan tidak menjelaskan mengapa seseorang harus mencoba ini. - person abarisone; 06.09.2016
comment
Jawaban Anda tidak ada hubungannya dengan pertanyaan itu. - person menxin; 05.09.2019