Bagikan melalui


Operator pengujian jenis dan ekspresi transmisi - is, , astypeof dan transmisi

Operator dan ekspresi ini melakukan pemeriksaan jenis atau konversi jenis. Operator is memeriksa apakah jenis run-time ekspresi kompatibel dengan jenis tertentu. Operator as secara eksplisit mengonversi ekspresi ke jenis tertentu jika jenis run-time-nya kompatibel dengan jenis tersebut. Ekspresi cast melakukan konversi eksplisit ke jenis target. Operator typeof mendapatkan instans System.Type untuk jenis.

operator is

Operator is memeriksa apakah jenis run-time dari sebuah ekspresi kompatibel dengan jenis yang diberikan. Operator is juga menguji hasil ekspresi terhadap pola.

Ekspresi dengan operator type-testing is memiliki bentuk berikut

E is T

E merupakan ekspresi yang mengembalikan sebuah nilai dan T merupakan nama jenis atau parameter jenis. E tidak boleh berupa metode anonim atau ekspresi lambda.

Operator is memunculkan true ketika hasil ekspresi bukan null dan salah satu kondisi berikut ini benar:

Operator is tidak mempertimbangkan konversi yang ditentukan pengguna.

Contoh berikut menunjukkan bahwa operator is mengembalikan true jika jenis run-time hasil ekspresi berasal dari jenis yang diberikan, yaitu, adanya konversi referensi antara jenis-jenis:

public class Base { }

public class Derived : Base { }

public static class IsOperatorExample
{
    public static void Main()
    {
        object b = new Base();
        Console.WriteLine(b is Base);  // output: True
        Console.WriteLine(b is Derived);  // output: False

        object d = new Derived();
        Console.WriteLine(d is Base);  // output: True
        Console.WriteLine(d is Derived); // output: True
    }
}

Contoh berikutnya menunjukkan bahwa operator is memperhitungkan konversi boxing dan unboxing, tetapi tidak mempertimbangkan konversi numerik:

int i = 27;
Console.WriteLine(i is System.IFormattable);  // output: True

object iBoxed = i;
Console.WriteLine(iBoxed is int);  // output: True
Console.WriteLine(iBoxed is long);  // output: False

Untuk informasi tentang konversi C#, lihat bab Konversi pada Spesifikasi bahasa C#.

Type testing dengan pencocokan pola

Operator is juga menguji hasil ekspresi terhadap pola. Contoh berikut menunjukkan cara menggunakan pola deklarasi untuk memeriksa jenis run-time ekspresi:

int i = 23;
object iBoxed = i;
int? jNullable = 7;
if (iBoxed is int a && jNullable is int b)
{
    Console.WriteLine(a + b);  // output 30
}

Untuk informasi tentang pola yang didukung, lihat Pola.

operator as

Operator as secara eksplisit mengonversi hasil sebuah ekspresi menjadi referensi tertentu atau jenis nilai yang dapat diubah ke null. Jika konversi tersebut tidak memungkinkan, operator as akan mengembalikan null. Tidak seperti ekspresi konversi eksplisit, operator as tidak pernah memunculkan pengecualian.

Ekspresi bentuknya

E as T

E adalah ekspresi yang mengembalikan nilai dan T adalah nama jenis atau parameter jenis, mengeluarkan hasil yang sama dengan

E is T ? (T)(E) : (T)null

kecuali E hanya dievaluasi sekali.

Operator as hanya mempertimbangkan konversi referensi, boxing, unboxing, dan konversi yang dapat diubah ke null. Anda tidak dapat menggunakan operator as untuk melakukan konversi yang ditentukan pengguna. Untuk melakukannya, gunakan ekspresi konversi eksplisit.

Contoh berikut menunjukkan penggunaan operator as:

IEnumerable<int> numbers = new List<int>(){10, 20, 30};
IList<int> indexable = numbers as IList<int>;
if (indexable != null)
{
    Console.WriteLine(indexable[0] + indexable[indexable.Count - 1]);  // output: 40
}

Catatan

Seperti yang ditunjukkan contoh sebelumnya, Anda perlu membandingkan hasil ekspresi as dengan null untuk memeriksa apakah konversi berhasil. Anda dapat menggunakan operator is baik untuk menguji apakah konversi berhasil dan, jika berhasil, tetapkan hasilnya ke variabel baru.

Ekspresi konversi eksplisit

Ekspresi konversi eksplisit dari bentuk (T)E melakukan konversi eksplisit dari hasil ekspresi E ke jenis T. Jika tidak ada konversi eksplisit dari jenis E ke jenis T, kesalahan waktu kompilasi terjadi. Pada durasi, konversi eksplisit mungkin tidak berhasil dan ekspresi konversi eksplisit mungkin memunculkan pengecualian.

Contoh berikut menunjukkan konversi numerik dan referensi eksplisit:

double x = 1234.7;
int a = (int)x;
Console.WriteLine(a);   // output: 1234

int[] ints = [10, 20, 30];
IEnumerable<int> numbers = ints;
IList<int> list = (IList<int>)numbers;
Console.WriteLine(list.Count);  // output: 3
Console.WriteLine(list[1]);  // output: 20

Untuk informasi tentang konversi eksplisit yang didukung, lihat bagian Konversi eksplisit dari Spesifikasi bahasa C#. Untuk informasi tentang cara menentukan konversi jenis eksplisit atau implisit kustom, lihat Operator konversi yang ditentukan pengguna.

Penggunaan lainnya dari ()

Anda juga dapat menggunakan tanda kurung untuk memanggil metode atau menggunakan delegasi.

Penggunaan tanda kurung lainnya adalah untuk menyesuaikan urutan dengan tujuan melakukan evaluasi operasi dalam sebuah ekspresi. Untuk informasi selengkapnya, lihat Operator C#.

Operator typeof

Operator typeof mendapatkan instans System.Type untuk suatu jenis. Argumen ke operator typeof harus berupa nama jenis atau parameter jenis, seperti yang ditunjukkan contoh berikut:

void PrintType<T>() => Console.WriteLine(typeof(T));

Console.WriteLine(typeof(List<string>));
PrintType<int>();
PrintType<System.Int32>();
PrintType<Dictionary<int, char>>();
// Output:
// System.Collections.Generic.List`1[System.String]
// System.Int32
// System.Int32
// System.Collections.Generic.Dictionary`2[System.Int32,System.Char]

Argumen tidak boleh berupa jenis yang memerlukan anotasi metadata. Contohnya termasuk jenis berikut:

  • dynamic
  • string? (atau jenis referensi apa pun yang dapat diubah ke null)

Jenis ini tidak diwakili secara langsung dalam metadata. Jenis ini mencakup atribut yang menjelaskan jenis dasar. Dalam kedua kasus, Anda dapat menggunakan jenis yang mendasarinya. Daripada dynamic, Anda dapat menggunakan object. Daripada string?, Anda dapat menggunakan string.

Anda juga dapat menggunakan operator typeof dengan jenis generik yang tidak terikat. Nama jenis generik yang tidak terikat harus berisi jumlah koma yang sesuai, yaitu kurang dari jumlah parameter jenis. Contoh berikut menunjukkan penggunaan operator typeof dengan jenis generik yang tidak terikat:

Console.WriteLine(typeof(Dictionary<,>));
// Output:
// System.Collections.Generic.Dictionary`2[TKey,TValue]

Ekspresi tidak dapat menjadi argumen operator typeof. Untuk mendapatkan instans System.Type pada jenis run-time hasil ekspresi, gunakan metode Object.GetType.

Type testing dengan operator typeof

Gunakan operator typeof untuk memeriksa apakah jenis run-time hasil ekspresi sama persis dengan jenis yang diberikan. Contoh berikut menunjukkan perbedaan antara pemeriksaan jenis yang dilakukan dengan operator typeof dan operator is:

public class Animal { }

public class Giraffe : Animal { }

public static class TypeOfExample
{
    public static void Main()
    {
        object b = new Giraffe();
        Console.WriteLine(b is Animal);  // output: True
        Console.WriteLine(b.GetType() == typeof(Animal));  // output: False

        Console.WriteLine(b is Giraffe);  // output: True
        Console.WriteLine(b.GetType() == typeof(Giraffe));  // output: True
    }
}

Kelebihan beban operator

Operator is, as, dan typeof tidak dapat kelebihan beban.

Jenis yang ditentukan pengguna tidak dapat membebani operator () secara berlebihan, tetapi dapat menentukan konversi jenis kustom yang dapat dilakukan oleh ekspresi konversi eksplisit. Untuk informasi selengkapnya, lihat Operator konversi yang ditentukan pengguna.

Spesifikasi bahasa C#

Untuk informasi selengkapnya, lihat bagian berikut dari spesifikasi bahasa C#:

Lihat juga