x ? "yes" : "no"
โดยทั่วไปจะใช้หลักของเครื่องหมายคำถามคือสำหรับเงื่อนไข
แต่ฉันเห็นการใช้งานอื่นแล้ว แต่ไม่สามารถหาคำอธิบายเกี่ยวกับการใช้งาน?
โอเปอเรเตอร์นี้ได้
public int? myProperty
{
get;
set;
}
x ? "yes" : "no"
โดยทั่วไปจะใช้หลักของเครื่องหมายคำถามคือสำหรับเงื่อนไข
แต่ฉันเห็นการใช้งานอื่นแล้ว แต่ไม่สามารถหาคำอธิบายเกี่ยวกับการใช้งาน?
โอเปอเรเตอร์นี้ได้
public int? myProperty
{
get;
set;
}
คำตอบ:
หมายความว่าประเภทค่าที่เป็นปัญหานั้นเป็นประเภทที่ไม่สามารถใช้ได้
ชนิดที่ 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); } } }
int
ประเภทและInteger
คลาสที่สอดคล้องกันตัวอย่างเช่น
Nullable<int>
มันเป็นชวเลขเป็น ถูกนำมาใช้เพื่อให้พิมพ์ค่าที่จะได้รับการตั้งค่าให้Nullable<T>
null
ประเภทค่ามักจะไม่สามารถเป็นโมฆะ
value types
ค่าต้องไม่เป็นโมฆะ หากคุณประกาศ int หรือบูล (ซึ่งเป็นประเภทค่า) โดยไม่ได้กำหนดค่าเฉพาะพวกเขาจะยังคงมีค่า (0 และเท็จตามลำดับ) เช่น พวกเขาจะไม่เป็นโมฆะ ในทางกลับreference types
กันเช่นวัตถุหรือ MyClass จะเป็นโมฆะ คุณอาจต้องการอ่านความแตกต่างระหว่างประเภทค่าและประเภทการอ้างอิง
ใน
x ? "yes" : "no"
? ประกาศประโยคif ที่นี่: xหมายถึงเงื่อนไขบูลีน; ส่วนก่อน:เป็นประโยคนั้นและส่วนหลังคือประโยคอื่น
ในตัวอย่างเช่น
int?
? ประกาศประเภท nullable และหมายความว่าประเภทก่อนมันอาจมีค่า null
return value ? value : "isNull";
บอกฉันว่าstring value
ไม่ใช่แปลงเป็นบูล
ชนิดที่ Nullable เป็นอินสแตนซ์ของโครงสร้าง System.Nullable ประเภท nullable สามารถเป็นตัวแทนของช่วงปกติของค่าสำหรับประเภทมูลค่าพื้นฐานบวกค่า ตัวอย่างเช่น [
Nullable<Int32>
], ออกเสียงว่า "Nullable of Int32" สามารถกำหนดค่าใด ๆ ได้ตั้งแต่ -2147483648 ถึง 2147483647 หรือสามารถกำหนดค่า Null ได้ [Nullable<bool>
] สามารถกำหนดค่าเป็นจริงหรือเท็จหรือเป็นโมฆะ ความสามารถในการกำหนดค่า Null ให้กับประเภทตัวเลขและบูลีนนั้นมีประโยชน์อย่างยิ่งเมื่อจัดการกับฐานข้อมูลและชนิดข้อมูลอื่น ๆ ที่มีองค์ประกอบที่อาจไม่ได้รับการกำหนดค่า ตัวอย่างเช่นเขตข้อมูลบูลีนในฐานข้อมูลสามารถจัดเก็บค่าจริงหรือเท็จหรืออาจไม่ได้กำหนด
มันประกาศว่าประเภทเป็นโมฆะ
การใช้งานจริง:
public string someFunctionThatMayBeCalledWithNullAndReturnsString(int? value)
{
if (value == null)
{
return "bad value";
}
return someFunctionThatHandlesIntAndReturnsString(value);
}
เพื่อเพิ่มคำตอบข้างต้นนี่คือตัวอย่างรหัส
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)
int?
Nullable<int>
เป็นชวเลข ทั้งสองรูปแบบสามารถใช้แทนกันได้
Nullable<T>
เป็นผู้ดำเนินการที่คุณสามารถใช้กับประเภทค่าT
เพื่อให้ยอมรับnull
ได้
ในกรณีที่คุณไม่ทราบว่ามันคุ้มค่าประเภทคือประเภทที่รับค่าเป็นint
, bool
, char
ฯลฯ ...
พวกเขาไม่สามารถยอมรับการอ้างอิงถึงค่า: พวกเขาจะสร้างข้อผิดพลาดในการคอมไพล์เวลาถ้าคุณกำหนดให้พวกเขาnull
เมื่อเทียบกับประเภทการอ้างอิงซึ่งสามารถยอมรับได้อย่างชัดเจน
ทำไมคุณต้องการมัน เนื่องจากบางครั้งตัวแปรประเภทค่าของคุณอาจได้รับการอ้างอิงแบบ null ซึ่งส่งคืนโดยบางสิ่งที่ทำงานได้ไม่ดีนักเช่นตัวแปรที่ขาดหายไปหรือไม่ได้กำหนดส่งคืนจากฐานข้อมูล
ฉันแนะนำให้คุณอ่านเอกสาร Microsoftเพราะมันครอบคลุมหัวข้อค่อนข้างดี