ฉันจะแปลงให้เป็นโมฆะint
ได้int
อย่างไร สมมติว่าฉันมี 2 ประเภท int ดังนี้:
int? v1;
int v2;
ฉันต้องการที่จะกำหนดv1
's v2
มูลค่าให้กับ v2 = v1;
จะทำให้เกิดข้อผิดพลาด ฉันจะแปลงv1
เป็นv2
อย่างไร
ฉันจะแปลงให้เป็นโมฆะint
ได้int
อย่างไร สมมติว่าฉันมี 2 ประเภท int ดังนี้:
int? v1;
int v2;
ฉันต้องการที่จะกำหนดv1
's v2
มูลค่าให้กับ v2 = v1;
จะทำให้เกิดข้อผิดพลาด ฉันจะแปลงv1
เป็นv2
อย่างไร
คำตอบ:
คำตอบอื่น ๆ ที่ถูกต้องทั้งหมด; ฉันแค่ต้องการเพิ่มอีกหนึ่งที่สะอาดกว่าเล็กน้อย:
v2 = v1 ?? default(int);
ใด ๆ ที่Nullable<T>
สามารถแปลงได้โดยปริยายเพื่อT
พิสูจน์ว่านิพจน์ทั้งหมดที่ถูกประเมินไม่สามารถส่งผลให้การกำหนดค่า null ให้กับ ValueType ดังนั้นตัวดำเนินการ null รวมกัน??
เป็นเพียงไวยากรณ์น้ำตาลสำหรับผู้ประกอบการที่ประกอบไปด้วย:
v2 = v1 == null ? default(int) : v1;
... ซึ่งอยู่ในไวยากรณ์ของน้ำตาลสำหรับ if / else:
if(v1==null)
v2 = default(int);
else
v2 = v1;
นอกจากนี้ในฐานะของ. NET 4.0 Nullable<T>
ยังมีวิธี "GetValueOrDefault ()" ซึ่งเป็นตัวรับสัญญาณที่ไม่ปลอดภัยซึ่งโดยทั่วไปแล้วจะทำการรวมกันเป็นโมฆะที่แสดงด้านบนดังนั้นสิ่งนี้ก็ใช้ได้เช่นกัน:
v2 = v1.GetValueOrDefault();
default(int)
ความจำเป็นจริงๆ? มีอะไรผิดปกติกับง่ายๆ0
?
default
ตามความเหมาะสม เลขศูนย์ไม่ถูกต้องเสมอเป็นค่าเริ่มต้นน้อยกว่ามากดังนั้นหากคุณแทนที่int
ด้วยทั่วไปT
คุณจะพบว่ารหัสของฉันทำงานในขณะที่ศูนย์ไม่ได้ ในบางเวอร์ชันของเฟรมเวิร์กในอนาคตdefault
อาจกลายเป็นโอเวอร์โหลดได้เช่นกัน หากและเมื่อสิ่งนั้นเกิดขึ้นรหัสที่ใช้ค่าเริ่มต้นจะสามารถใช้ประโยชน์ได้ง่ายในขณะที่ค่า Null ที่ชัดเจนหรือการกำหนดค่าศูนย์จะต้องเปลี่ยน
แบบนี้,
if(v1.HasValue)
v2=v1.Value
คุณสามารถใช้คุณสมบัติค่าสำหรับการมอบหมาย
v2 = v1.Value;
v1.HasValue
ก่อน
สิ่งที่คุณต้องการคือ ..
v2= v1.GetValueOrDefault();
หากคุณรู้ว่าv1
มีค่าคุณสามารถใช้Value
คุณสมบัติ:
v2 = v1.Value;
การใช้GetValueOrDefault
เมธอดจะกำหนดค่าหากมีอย่างใดอย่างหนึ่งไม่เช่นนั้นค่าเริ่มต้นสำหรับประเภทหรือค่าเริ่มต้นที่คุณระบุ:
v2 = v1.GetValueOrDefault(); // assigns zero if v1 has no value
v2 = v1.GetValueOrDefault(-1); // assigns -1 if v1 has no value
คุณสามารถใช้HasValue
คุณสมบัติเพื่อตรวจสอบว่าv1
มีค่า:
if (v1.HasValue) {
v2 = v1.Value;
}
นอกจากนี้ยังมีการสนับสนุนภาษาสำหรับGetValueOrDefault(T)
วิธีการ:
v2 = v1 ?? -1;
คุณไม่สามารถทำได้ถ้า v1 เป็นโมฆะ แต่คุณสามารถตรวจสอบกับผู้ให้บริการได้
v2 = v1 ?? 0;
GetValueOrDefault()
ดึงค่าของวัตถุ ถ้ามันเป็นโมฆะมันจะส่งกลับค่าเริ่มต้นของ int ซึ่งก็คือ 0
ตัวอย่าง:
v2= v1.GetValueOrDefault();
หากค่าเริ่มต้นสำหรับประเภทที่กำหนดเป็นผลลัพธ์ที่ยอมรับได้:
if (v1.HasValue)
v2 = v1.GetValueOrDefault();
หากคุณต้องการค่าเริ่มต้นที่แตกต่างกันเมื่อไม่ได้กำหนดผลลัพธ์:
v2 = v1.GetValueOrDefault(255); // or any valid value for int in place of 255
หากคุณต้องการคืนค่า (ไม่ว่าเมธอดจะล้มเหลวหรือไม่ก็ตาม):
v2 = v1.GetValueOrDefault();
.NET 4.7.2: GetValueOrDefault()
ส่งคืนค่าฟิลด์โดยไม่ตรวจสอบใด ๆ
เท่าที่ฉันกังวลทางออกที่ดีที่สุดคือการใช้GetValueOrDefault()
วิธีการ
v2 = v1.GetValueOrDefault();
การแปลง Int เป็นค่าที่ไม่สามารถแปลงได้นั้นสามารถทำได้ดังนี้:
v2=(int)v1;
เป็นไปได้ด้วย v2 = Convert.ToInt32(v1);
คุณสามารถทำได้
v2 = v1.HasValue ? v1.Value : v2;
การแปลงระหว่างที่เรียบง่ายv1
และv2
เป็นไปไม่ได้เพราะมีโดเมนที่มีขนาดใหญ่ของค่ากว่าv1
v2
มันเป็นทุกอย่างที่v1
สามารถถือรวมทั้งnull
รัฐ ในการแปลงคุณต้องระบุอย่างชัดเจนว่าint
จะใช้ค่าใดในการแมปnull
สถานะ วิธีที่ง่ายที่สุดในการทำเช่นนี้คือ??
ผู้ควบคุมเครื่อง
v2 = v1 ?? 0; // maps null of v1 to 0
สิ่งนี้สามารถทำได้ในรูปแบบยาว
int v2;
if (v1.HasValue) {
v2 = v1.Value;
} else {
v2 = 0;
}
ขึ้นอยู่กับบริบทการใช้งานของคุณคุณอาจใช้คุณสมบัติการจับคู่รูปแบบของ C # 7:
int? v1 = 100;
if (v1 is int v2)
{
Console.WriteLine($"I'm not nullable anymore: {v2}");
}
เนื่องจากบางคนกำลัง downvoting โดยไม่ต้องออกคำอธิบายฉันต้องการเพิ่มรายละเอียดบางอย่างเพื่ออธิบายเหตุผลในการรวมสิ่งนี้เป็นทางออกที่ทำงานได้
ตอนนี้การจับคู่รูปแบบของ C # 7ช่วยให้เราสามารถตรวจสอบประเภทของค่าและส่งค่าโดยปริยาย ในตัวอย่างด้านบน if-condition จะผ่านก็ต่อเมื่อค่าที่เก็บไว้ในv1
นั้นเป็นชนิดที่เข้ากันได้กับประเภทสำหรับv2
int
ซึ่งในกรณีนี้คือ มันดังต่อไปว่าเมื่อค่าสำหรับv1
เป็นnull
ที่ถ้าสภาพจะล้มเหลวตั้งแต่ null int
ไม่สามารถมอบหมายให้ เพิ่มเติมอย่างถูกต้องไม่ได้เป็นnull
int
ฉันต้องการเน้นว่าโซลูชันนี้อาจไม่ใช่ตัวเลือกที่ดีที่สุดเสมอไป ตามที่ฉันแนะนำฉันเชื่อว่าสิ่งนี้จะขึ้นอยู่กับบริบทการใช้งานที่แน่นอนของผู้พัฒนา หากคุณมีint?
และต้องการดำเนินการตามเงื่อนไขกับมูลค่าของif-and-only-ifค่าที่กำหนดไม่เป็นโมฆะ (นี่เป็นครั้งเดียวเท่านั้นที่จะปลอดภัยการแปลง int ที่สามารถเปลี่ยนค่าได้เป็น int ปกติโดยไม่สูญเสียข้อมูล) การจับคู่รูปแบบอาจเป็นวิธีที่กระชับที่สุดวิธีหนึ่งในการทำเช่นนี้
HasValue
เช็คของคุณโดยไม่ได้ตั้งใจ
มันจะกำหนดค่าของv1
ถึงv2
หากไม่เป็นโมฆะมิฉะนั้นจะใช้ค่าเริ่มต้นเป็นศูนย์
v2=v1??0
หรือด้านล่างเป็นวิธีอื่นในการเขียน
v2 = v1.HasValue?v1:0
ใน C # 7.1 และใหม่กว่าประเภทสามารถอนุมานได้โดยใช้default
ตัวอักษรแทนตัวdefault
ดำเนินการเพื่อให้สามารถเขียนได้ดังนี้:
v2 = v1 ?? default;
int v2= Int32.Parse(v1.ToString());
v1
เป็นคือnull
อะไร?