Apa tujuan dari tanda tanya setelah jenis (misalnya: int? MyVariable)?

433

Biasanya penggunaan utama dari tanda tanya adalah untuk persyaratan x ? "yes" : "no",.

Tetapi saya telah melihat kegunaan lain untuk itu tetapi tidak dapat menemukan penjelasan tentang penggunaan ?operator ini, misalnya.

public int? myProperty
{
   get;
   set;
}
GenEric35
sumber

Jawaban:

438

Ini berarti bahwa tipe nilai yang dimaksud adalah tipe yang dapat dibatalkan

Jenis Nullable adalah contoh dari System. Struct Nullable. Tipe nullable dapat mewakili kisaran nilai yang benar untuk tipe nilai dasarnya, ditambah nilai null tambahan. Misalnya, a Nullable<Int32>, dilafalkan "Nullable of Int32," dapat diberi nilai apa pun dari -2147483648 hingga 2147483647, atau dapat diberi nilai nol. A Nullable<bool>dapat diberi nilai true, false, atau null. Kemampuan untuk menetapkan null ke tipe numerik dan Boolean sangat berguna ketika Anda berurusan dengan database dan tipe data lainnya yang berisi elemen yang mungkin tidak diberi nilai. Misalnya, bidang Boolean dalam database dapat menyimpan nilai-nilai benar atau salah, atau mungkin tidak terdefinisi.

class NullableExample
{
  static void Main()
  {
      int? num = null;

      // Is the HasValue property true?
      if (num.HasValue)
      {
          System.Console.WriteLine("num = " + num.Value);
      }
      else
      {
          System.Console.WriteLine("num = Null");
      }

      // y is set to zero
      int y = num.GetValueOrDefault();

      // num.Value throws an InvalidOperationException if num.HasValue is false
      try
      {
          y = num.Value;
      }
      catch (System.InvalidOperationException e)
      {
          System.Console.WriteLine(e.Message);
      }
  }
}
Sean
sumber
3
Digunakan untuk struct. Jangan berpikir itu sebenarnya berguna untuk kelas.
MonsieurDart
8
@ MonsieurDart - itu sebabnya jawabannya mengatakan "tipe nilai"
Sean
3
@AntoineDahan - tipe nilai tidak memiliki tipe yang dapat dibatalkan karena menurut definisi tidak dapat dibatalkan. Saya pikir Anda berpikir tentang Java di mana ada inttipe dan Integerkelas yang sesuai , misalnya.
Sean
2
lebih baru (2015) dokumentasi untuk jenis nullable di sini
dinosaurus
2
Perhatikan juga bahwa tanda tanya dapat mengikuti objek (contoh tipe) di c # 6 (VS 2015)
Zim
119

Ini adalah singkatan untuk Nullable<int>. Nullable<T>digunakan untuk memungkinkan tipe nilai diatur ke null. Jenis nilai biasanya tidak boleh nol .

Klaus Byskov Pedersen
sumber
3
ditambah satu untuk menggunakan istilah singkatan, Cukup lurus ke depan!
Hari
3
Kalimat kedua membingungkan saya. Apa yang Anda maksud dengan "tidak bisa"? Pada tingkat kompiler atau dalam konteks aplikasi.
problemofficer
5
@problemofficer per definisi, value typestidak boleh nol. Jika Anda mendeklarasikan int atau bool (yang merupakan tipe nilai) tanpa secara khusus menetapkan nilai, mereka akan tetap memiliki nilai (masing-masing 0 dan false), yaitu. mereka tidak akan menjadi nol. Diabaikan reference types, seperti objek atau MyClass, akan, sebaliknya, menjadi nol. Anda mungkin ingin membaca tentang perbedaan antara tipe nilai dan tipe referensi.
Klaus Byskov Pedersen
Terima kasih atas penjelasannya. Saya mengerti sekarang.
problemofficer
62

Di

x ? "yes" : "no"

itu ? mendeklarasikan kalimat if . Di sini: x mewakili kondisi boolean; Bagian sebelum : adalah kalimat lalu dan bagian sesudahnya adalah kalimat lain .

Dalam, misalnya,

int?

itu ? mendeklarasikan tipe nullable, dan berarti tipe sebelum itu mungkin memiliki nilai null.

eKek0
sumber
9
Saya tidak melihat hubungan antara '?' mendeklarasikan tipe null -able dan ekspresi ternary. Memilih jawaban Anda, Pak.
Gus Crawford
36
Saya tidak setuju dengan komentar di atas dari Gus. Pertanyaannya menunjukkan bahwa ada kemungkinan kebingungan dengan ekspresi ternary. Jawaban ini mengatasi masalah ini.
Mario Levesque
Di mana Anda akan menggunakan pembandingan nol semacam ini? Di dalam pengembalian sepertinya tidak diizinkan. return value ? value : "isNull";memberitahu saya bahwa string valueisnt convertable menjadi bool.
C4d
Saya harus mengatakan ini adalah jawaban yang sangat berbelit-belit, terutama jika dibandingkan dengan orang lain dalam pertanyaan ini .. -1
FastTrack
Ini harus menjadi jawaban yang diterima. Karena jelas dan tepat. +1
JP Dolocanog
49

Jenis yang Tidak Dapat Diabaikan

Jenis Nullable adalah contoh dari System. Struct Nullable. Tipe nullable dapat mewakili kisaran nilai normal untuk tipe nilai yang mendasarinya, ditambah nilai null tambahan . Sebagai contoh, a [ Nullable<Int32>], diucapkan "Nullable of Int32," dapat diberi nilai apa pun dari -2147483648 hingga 2147483647, atau dapat diberi nilai nol. A [ Nullable<bool>] dapat diberi nilai true atau false, atau null. Kemampuan untuk menetapkan null ke tipe numerik dan Boolean sangat berguna ketika berhadapan dengan database dan tipe data lainnya yang mengandung elemen yang mungkin tidak diberi nilai. Misalnya, bidang Boolean dalam database dapat menyimpan nilai-nilai benar atau salah, atau mungkin tidak terdefinisi.

Ahmet Kakıcı
sumber
11

itu menyatakan bahwa jenisnya nullable.

Thanos Papathanasiou
sumber
2
Entri pertama Anda tidak masuk akal, mengingat sampel penanya.
Binary Worrier
Hanya ingin tahu tentang peringkat ketika semua jawaban mendalam di atas :)
Naga
6

penggunaan praktis:

public string someFunctionThatMayBeCalledWithNullAndReturnsString(int? value)
{
  if (value == null)
  {
    return "bad value";
  }

  return someFunctionThatHandlesIntAndReturnsString(value);
}
AJBauer
sumber
1
Sementara OP masih aktif, 5 tahun setelah pertanyaan diajukan, jawabannya mungkin tidak lagi relevan.
Strawberry
10
bagi saya itu 3 jam yang lalu :-)
AJBauer
3

Untuk menambahkan jawaban di atas, berikut adalah contoh kode

struct Test
{
    int something;
}
struct NullableTest
{
    int something;
}
class Example
{
    public void Demo()
    {
        Test t = new Test();
        t = null;

        NullableTest? t2 = new NullableTest();
        t2 = null;
    }
}

Ini akan memberikan kesalahan kompilasi:

Kesalahan 12 Tidak dapat mengonversi nol ke 'Tes' karena ini adalah jenis nilai yang tidak dapat dibatalkan

Perhatikan bahwa tidak ada kesalahan kompilasi untuk NullableTest. (perhatikan? dalam deklarasi t2)

Sunil Purushothaman
sumber
2

int? adalah singkatan Nullable<int> . Kedua bentuk itu saling dipertukarkan.

Nullable<T>adalah operator yang dapat Anda gunakan dengan tipe nilai Tuntuk membuatnya diterimanull .

Dalam kasus Anda tidak tahu itu: nilai jenis yang jenis yang menerima nilai-nilai sebagai int, bool, chardll ...

Mereka tidak dapat menerima referensi ke nilai: mereka akan menghasilkan kesalahan waktu kompilasi jika Anda menetapkannya null, sebagai lawan dari jenis referensi , yang jelas dapat menerimanya.

Mengapa Anda membutuhkannya? Karena terkadang variabel tipe nilai Anda dapat menerima referensi nol yang dikembalikan oleh sesuatu yang tidak berfungsi dengan baik, seperti variabel yang hilang atau tidak ditentukan yang dikembalikan dari database.

Saya sarankan Anda untuk membaca Dokumentasi Microsoft karena itu mencakup subjek dengan cukup baik.

Nicola Amadio
sumber