ค่าเริ่มต้นของประเภท "int" ที่เป็นโมฆะคืออะไร (รวมเครื่องหมายคำถาม)?


107

ใน C # ค่าเริ่มต้นของตัวแปรประเภทอินสแตนซ์คลาสint?คืออะไร?

ตัวอย่างเช่นในรหัสต่อไปนี้จะMyNullableIntมีค่าใดหากไม่ได้กำหนดไว้อย่างชัดเจน

class MyClass
{
    public int? MyNullableInt;
}

(ดูเหมือนว่าคำตอบนั้นเกือบจะแน่นอนnullหรือ0แต่คำตอบนั้นคือข้อใด)


9
ทำไมต้องโหวตลง? (คำตอบสำหรับคำถามนี้ในตอนแรกไม่ชัดเจนสำหรับฉันโดยไม่ได้เรียกใช้โค้ดเพื่อทดสอบพฤติกรรมและน่าแปลกใจที่ฉันไม่พบคำถามนี้ซ้ำใน StackOverflow หรือหาได้ง่ายผ่านทาง Google จากที่อื่น)
Jon Schneider

1
คุณสามารถดูที่นี่ - Google hit แรกสำหรับฉัน
500 - ข้อผิดพลาดภายในเซิร์ฟเวอร์

2
@ 500 - ฉันพบบทความนั้นตอนที่กำลังค้นคว้า - จริง ๆ แล้วฉันเชื่อมโยงกับมันในคำตอบของตัวเองด้านล่าง - แต่เท่าที่ฉันสามารถบอกได้ว่าบทความไม่ได้ระบุอย่างชัดเจนว่าค่าเริ่มต้นของอินสแตนซ์ประเภทที่เป็นโมฆะ เป็นโมฆะ มันไม่พูดว่า "ค่าเริ่มต้นสำหรับ HasValue เป็นเท็จ. มูลค่าทรัพย์สินไม่มีค่าเริ่มต้น" แต่ไม่ได้ตอบคำถามโดยตรงเดิมของฉันโดยไม่ต้องบางขุดเพิ่มเติม
Jon Schneider

2
ฉันสงสัยว่าเป็นเพราะคุณสามารถกำหนดจุดพักและดูว่าค่าคืออะไรหรือในประเภทหน้าต่างทันทีint? x;และดูว่าผลลัพธ์คืออะไร?
Rufus L

คำตอบ:


139

ค่าเริ่มต้นสำหรับint?- และสำหรับประเภทที่เป็นโมฆะใด ๆ ที่ใช้ "type?" ประกาศ - คือnull.

เหตุใดจึงเป็นเช่นนั้น:

  • int?คือน้ำตาลวากยสัมพันธ์สำหรับประเภทNullable <T> (โดยที่ T คือint) ซึ่งเป็นโครงสร้าง ( อ้างอิง )
  • Nullable<T>ประเภทมีHasValue บูลสมาชิกซึ่งเมื่อfalseทำให้Nullable<T>อินสแตนซ์ "การกระทำเช่นว่า" nullคุ้มค่า โดยเฉพาะอย่างยิ่งเมธอด Nullable <T> .Equals จะถูกแทนที่เพื่อส่งคืนtrueเมื่อ a Nullable<T>กับHasValue == falseถูกเปรียบเทียบกับnullค่าจริง
  • จากข้อกำหนดภาษา C # 11.3.4ค่าเริ่มต้นของอินสแตนซ์โครงสร้างคือฟิลด์ชนิดค่าของโครงสร้างทั้งหมดที่ตั้งค่าเป็นค่าเริ่มต้นและฟิลด์ประเภทการอ้างอิงทั้งหมดของโครงสร้างนั้นตั้งค่าเป็นnullว่าเขตข้อมูลชนิดการอ้างอิงการตั้งค่าให้
  • ค่าเริ่มต้นของboolตัวแปรใน C # คือfalse ( การอ้างอิง ) ดังนั้นHasValueคุณสมบัติของNullable<T>อินสแตนซ์เริ่มต้นคือfalse; ซึ่งจะทำให้อินสแตนซ์ที่ตัวเองทำหน้าที่เหมือนNullable<T>null

เมื่อฉันเปลี่ยนการประกาศจากint? x = null;เป็นint? x;ฉันได้รับข้อผิดพลาดของคอมไพเลอร์เพิ่มเติมลงไปในโค้ด: "การใช้ตัวแปรโลคัลที่ไม่ได้กำหนด x"
John Pick

1
@JohnPick นั่นคือคุณสมบัติคอมไพเลอร์ C # ที่มีไว้เพื่อป้องกันจุดบกพร่องที่อาจเกิดขึ้นจากคุณ "ลืม" เพื่อเริ่มต้นตัวแปรก่อนที่จะใช้งาน สถานการณ์ที่คุณสามารถพบกับ int ที่ไม่ได้เริ่มต้น? คือเมื่อเป็นตัวแปรสมาชิกคลาส ตัวอย่างของทั้งสองที่นี่: blogs.msdn.microsoft.com/abhinaba/2005/11/08/…
Jon Schneider

โดยพื้นฐานแล้วสถานที่นี้เป็นบล็อกเทคโนโลยีของคุณหรือไม่? คุณถามคำถามที่คุณต้องรันโค้ดเพื่อรับคำตอบจากนั้นตอบคำถามด้วยตัวเองในนาทีเดียวกัน
GôTô

4
@JonSchneider ยุติธรรมพอแล้วฉันแย่แล้ว
GôTô

คำใบ้ / คำเตือนคอมไพเลอร์ของ VS ทำให้เข้าใจผิด: Field 'id' is never assigned to, and will always have its default value 0. ไม่แปลกเหรอ?
Hendy Irawan

32

ฉันรู้สึกว่าสำคัญที่จะต้องแบ่งปันNullable<T>.GetValueOrDefault()วิธีการที่มีประโยชน์อย่างยิ่งเมื่อทำงานกับการคำนวณทางคณิตศาสตร์ที่ใช้ค่าที่Nullable<int>เรียกint?ว่า มีหลายครั้งที่คุณไม่ต้องตรวจสอบHasValueทรัพย์สินและคุณสามารถใช้GetValueOrDefault()แทนได้

var defaultValueOfNullableInt = default(int?);
Console.WriteLine("defaultValueOfNullableInt == {0}", (defaultValueOfNullableInt == null) ? "null" : defaultValueOfNullableInt.ToString());

var defaultValueOfInt = default(int);
Console.WriteLine("defaultValueOfInt == {0}", defaultValueOfInt);

Console.WriteLine("defaultValueOfNullableInt.GetValueOrDefault == {0}", defaultValueOfNullableInt.GetValueOrDefault());

บรรทัดคำสั่งแสดงรหัสด้านบนใช้งานได้


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