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เพราะมันครอบคลุมหัวข้อค่อนข้างดี