จุดประสงค์ของเครื่องหมายคำถามหลังประเภท (เช่น: int? myVariable) คืออะไร


433

x ? "yes" : "no"โดยทั่วไปจะใช้หลักของเครื่องหมายคำถามคือสำหรับเงื่อนไข

แต่ฉันเห็นการใช้งานอื่นแล้ว แต่ไม่สามารถหาคำอธิบายเกี่ยวกับการใช้งาน?โอเปอเรเตอร์นี้ได้

public int? myProperty
{
   get;
   set;
}

คำตอบ:


437

หมายความว่าประเภทค่าที่เป็นปัญหานั้นเป็นประเภทที่ไม่สามารถใช้ได้

ชนิดที่ Nullable เป็นอินสแตนซ์ของโครงสร้าง System.Nullable ประเภท nullable สามารถแสดงช่วงของค่าที่ถูกต้องสำหรับประเภทค่าพื้นฐานรวมถึงค่า null เพิ่มเติม ตัวอย่างเช่น a Nullable<Int32>, ออกเสียง "Nullable of Int32" สามารถกำหนดค่าใด ๆ ได้ตั้งแต่ -2147483648 ถึง 2147483647 หรือสามารถกำหนดค่า Null ได้ Nullable<bool>สามารถกำหนดค่าจริงเท็จหรือ null ความสามารถในการกำหนดค่า Null ให้กับประเภทตัวเลขและบูลีนนั้นมีประโยชน์อย่างยิ่งเมื่อคุณจัดการกับฐานข้อมูลและชนิดข้อมูลอื่น ๆ ที่มีองค์ประกอบที่อาจไม่ได้รับการกำหนดค่า ตัวอย่างเช่นเขตข้อมูลบูลีนในฐานข้อมูลสามารถจัดเก็บค่าจริงหรือเท็จหรืออาจไม่ได้กำหนด

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);
      }
  }
}

3
ใช้สำหรับ struct อย่าคิดว่ามันมีประโยชน์สำหรับชั้นเรียนจริง ๆ
MonsieurDart

8
@MonsieurDart - นั่นเป็นเหตุผลที่คำตอบบอกว่า "value type"
Sean

3
@AntoineDahan - ประเภทค่าไม่มีประเภท nullable ตามที่กำหนดโดยไม่เป็นโมฆะ ฉันคิดว่าคุณกำลังคิดถึง Java ที่มีintประเภทและIntegerคลาสที่สอดคล้องกันตัวอย่างเช่น
Sean

2
เอกสารล่าสุด (2015) สำหรับประเภท nullable ที่นี่
ไดโนเสาร์


118

Nullable<int>มันเป็นชวเลขเป็น ถูกนำมาใช้เพื่อให้พิมพ์ค่าที่จะได้รับการตั้งค่าให้Nullable<T> nullประเภทค่ามักจะไม่สามารถเป็นโมฆะ


3
บวกหนึ่งสำหรับการใช้คำย่อชวเลขสวยตรงไปข้างหน้า!
ฮาริ

3
ประโยคที่สองทำให้ฉันสับสน คุณหมายถึงอะไรโดย "ไม่" ในระดับคอมไพเลอร์หรือในบริบทของแอปพลิเคชัน
ปัญหา

5
@problemofficer ต่อการกำหนดvalue typesค่าต้องไม่เป็นโมฆะ หากคุณประกาศ int หรือบูล (ซึ่งเป็นประเภทค่า) โดยไม่ได้กำหนดค่าเฉพาะพวกเขาจะยังคงมีค่า (0 และเท็จตามลำดับ) เช่น พวกเขาจะไม่เป็นโมฆะ ในทางกลับreference typesกันเช่นวัตถุหรือ MyClass จะเป็นโมฆะ คุณอาจต้องการอ่านความแตกต่างระหว่างประเภทค่าและประเภทการอ้างอิง
Klaus Byskov Pedersen

ขอบคุณสำหรับคำอธิบาย ฉันเข้าใจแล้ว.
problemofficer

62

ใน

x ? "yes" : "no"

? ประกาศประโยคif ที่นี่: xหมายถึงเงื่อนไขบูลีน; ส่วนก่อน:เป็นประโยคนั้นและส่วนหลังคือประโยคอื่น

ในตัวอย่างเช่น

int?

? ประกาศประเภท nullable และหมายความว่าประเภทก่อนมันอาจมีค่า null


9
ฉันไม่เห็นความสัมพันธ์ระหว่าง '?' ประกาศประเภทที่สามารถเป็นโมฆะและการแสดงออกที่สาม ลงคะแนนให้กับคำตอบของคุณ
Gus Crawford

36
ฉันไม่เห็นด้วยกับความคิดเห็นข้างต้นจากกัส คำถามแสดงให้เห็นว่ามีความสับสนที่อาจเกิดขึ้นกับการแสดงออกที่ประกอบไปด้วยสามส่วน คำตอบนี้แก้ไขปัญหานี้
Mario Levesque

คุณจะใช้การเปรียบเทียบแบบ null แบบไหน ภายในคืนดูเหมือนว่าจะไม่ได้รับอนุญาต return value ? value : "isNull";บอกฉันว่าstring valueไม่ใช่แปลงเป็นบูล
C4d

ฉันต้องบอกว่านี่เป็นคำตอบที่ซับซ้อนมากโดยเฉพาะเมื่อเปรียบเทียบกับคำถามอื่น ๆ .. -1
FastTrack

นี่ควรเป็นคำตอบที่ยอมรับได้ เนื่องจากมีความชัดเจนและแม่นยำ +1
JP Dolocanog

49

ประเภทที่เป็นโมฆะ

ชนิดที่ Nullable เป็นอินสแตนซ์ของโครงสร้าง System.Nullable ประเภท nullable สามารถเป็นตัวแทนของช่วงปกติของค่าสำหรับประเภทมูลค่าพื้นฐานบวกค่า ตัวอย่างเช่น [ Nullable<Int32>], ออกเสียงว่า "Nullable of Int32" สามารถกำหนดค่าใด ๆ ได้ตั้งแต่ -2147483648 ถึง 2147483647 หรือสามารถกำหนดค่า Null ได้ [ Nullable<bool>] สามารถกำหนดค่าเป็นจริงหรือเท็จหรือเป็นโมฆะ ความสามารถในการกำหนดค่า Null ให้กับประเภทตัวเลขและบูลีนนั้นมีประโยชน์อย่างยิ่งเมื่อจัดการกับฐานข้อมูลและชนิดข้อมูลอื่น ๆ ที่มีองค์ประกอบที่อาจไม่ได้รับการกำหนดค่า ตัวอย่างเช่นเขตข้อมูลบูลีนในฐานข้อมูลสามารถจัดเก็บค่าจริงหรือเท็จหรืออาจไม่ได้กำหนด


11

มันประกาศว่าประเภทเป็นโมฆะ


2
รายการแรกของคุณไม่สมเหตุสมผลเนื่องจากตัวอย่างถาม
ไบนารี Worrier

เพียงแค่อยากรู้เกี่ยวกับคะแนนเมื่อทุกคำตอบในเชิงลึกดังกล่าวข้างต้น :)
นาค

6

การใช้งานจริง:

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

  return someFunctionThatHandlesIntAndReturnsString(value);
}

1
ในขณะที่ OP ยังคงใช้งานอยู่ 5 ปีหลังจากถามคำถามคำตอบอาจไม่เกี่ยวข้องอีกต่อไป
สตรอเบอร์รี่

10
สำหรับฉันมันเป็น 3 ชั่วโมงที่ผ่านมา :-)
AJBauer

3

เพื่อเพิ่มคำตอบข้างต้นนี่คือตัวอย่างรหัส

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;
    }
}

สิ่งนี้จะทำให้เกิดข้อผิดพลาดในการรวบรวม:

ข้อผิดพลาด 12 ไม่สามารถแปลงค่า Null เป็น 'ทดสอบ' ได้เนื่องจากเป็นประเภทค่าที่ไม่สามารถใช้ได้

โปรดสังเกตว่าไม่มีข้อผิดพลาดในการรวบรวมสำหรับ NullableTest (โปรดสังเกตว่า? ในการประกาศของ t2)


2

int?Nullable<int>เป็นชวเลข ทั้งสองรูปแบบสามารถใช้แทนกันได้

Nullable<T>เป็นผู้ดำเนินการที่คุณสามารถใช้กับประเภทค่าTเพื่อให้ยอมรับnullได้

ในกรณีที่คุณไม่ทราบว่ามันคุ้มค่าประเภทคือประเภทที่รับค่าเป็นint, bool, charฯลฯ ...

พวกเขาไม่สามารถยอมรับการอ้างอิงถึงค่า: พวกเขาจะสร้างข้อผิดพลาดในการคอมไพล์เวลาถ้าคุณกำหนดให้พวกเขาnullเมื่อเทียบกับประเภทการอ้างอิงซึ่งสามารถยอมรับได้อย่างชัดเจน

ทำไมคุณต้องการมัน เนื่องจากบางครั้งตัวแปรประเภทค่าของคุณอาจได้รับการอ้างอิงแบบ null ซึ่งส่งคืนโดยบางสิ่งที่ทำงานได้ไม่ดีนักเช่นตัวแปรที่ขาดหายไปหรือไม่ได้กำหนดส่งคืนจากฐานข้อมูล

ฉันแนะนำให้คุณอ่านเอกสาร Microsoftเพราะมันครอบคลุมหัวข้อค่อนข้างดี

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.