ฉันได้ทำการวิจัยเกี่ยวกับเรื่องนี้โดยใช้วิธีการที่แตกต่างกันเพื่อกำหนดค่าให้กับ int ไม่สามารถ นี่คือสิ่งที่เกิดขึ้นเมื่อฉันทำสิ่งต่าง ๆ ควรชี้แจงสิ่งที่เกิดขึ้น โปรดทราบ: Nullable<something>
หรือชวเลขsomething?
เป็นโครงสร้างที่คอมไพเลอร์ดูเหมือนว่าจะทำงานมากมายเพื่อให้เราใช้เป็นโมฆะราวกับว่าเป็นคลาส
ดังที่คุณเห็นด้านล่างSomeNullable == null
และSomeNullable.HasValue
จะส่งกลับค่าที่คาดหวังจริงหรือเท็จเสมอ แม้ว่าจะไม่ได้แสดงไว้ด้านล่าง แต่SomeNullable == 3
ก็ใช้ได้เช่นกัน (สมมติว่า SomeNullable คือ an int?
)
ในขณะที่SomeNullable.Value
เราได้รับข้อผิดพลาด runtime ถ้าเราได้รับมอบหมายไปnull
SomeNullable
ในความเป็นจริงในกรณีเดียวที่ nullables อาจทำให้เรามีปัญหาด้วยการรวมกันของผู้ประกอบการมากเกินไป, มากไปobject.Equals(obj)
วิธีการและการเพิ่มประสิทธิภาพของคอมไพเลอร์และธุรกิจลิง
นี่คือคำอธิบายของโค้ดที่ฉันรันและผลลัพธ์ที่ผลิตในเลเบล:
int? val = null;
lbl_Val.Text = val.ToString(); //Produced an empty string.
lbl_ValVal.Text = val.Value.ToString(); //Produced a runtime error. ("Nullable object must have a value.")
lbl_ValEqNull.Text = (val == null).ToString(); //Produced "True" (without the quotes)
lbl_ValNEqNull.Text = (val != null).ToString(); //Produced "False"
lbl_ValHasVal.Text = val.HasValue.ToString(); //Produced "False"
lbl_NValHasVal.Text = (!(val.HasValue)).ToString(); //Produced "True"
lbl_ValValEqNull.Text = (val.Value == null).ToString(); //Produced a runtime error. ("Nullable object must have a value.")
lbl_ValValNEqNull.Text = (val.Value != null).ToString(); //Produced a runtime error. ("Nullable object must have a value.")
ตกลงให้ลองวิธีการเริ่มต้นต่อไป:
int? val = new int?();
lbl_Val.Text = val.ToString(); //Produced an empty string.
lbl_ValVal.Text = val.Value.ToString(); //Produced a runtime error. ("Nullable object must have a value.")
lbl_ValEqNull.Text = (val == null).ToString(); //Produced "True" (without the quotes)
lbl_ValNEqNull.Text = (val != null).ToString(); //Produced "False"
lbl_ValHasVal.Text = val.HasValue.ToString(); //Produced "False"
lbl_NValHasVal.Text = (!(val.HasValue)).ToString(); //Produced "True"
lbl_ValValEqNull.Text = (val.Value == null).ToString(); //Produced a runtime error. ("Nullable object must have a value.")
lbl_ValValNEqNull.Text = (val.Value != null).ToString(); //Produced a runtime error. ("Nullable object must have a value.")
ทุกอย่างเหมือนเดิม โปรดทราบว่าการกำหนดค่าเริ่มต้นด้วยint? val = new int?(null);
ด้วย null ที่ส่งผ่านไปยังตัวสร้างจะทำให้เกิดข้อผิดพลาดในการคอมไพล์เนื่องจากค่า VALUE ของวัตถุที่เป็นโมฆะนั้นไม่เป็นโมฆะ มันเป็นเพียงวัตถุห่อหุ้มตัวเองที่สามารถเป็นโมฆะ
ในทำนองเดียวกันเราจะได้รับข้อผิดพลาดในการรวบรวมเวลาจาก:
int? val = new int?();
val.Value = null;
ไม่ต้องพูดถึงว่าval.Value
เป็นคุณสมบัติแบบอ่านอย่างเดียวหมายความว่าเราไม่สามารถใช้สิ่งที่ชอบได้:
val.Value = 3;
แต่อีกครั้งตัวดำเนินการแปลงโดยนัยที่มีมากเกินไปทำให้เรา:
val = 3;
ไม่จำเป็นต้องกังวลเกี่ยวกับ polysomthing whatchamacallits ตราบใดที่มันใช้งานได้ :)