มีวิธีง่ายๆใน C # เพื่อตรวจสอบว่าอินสแตนซ์ DateTime ได้รับการกำหนดค่าหรือไม่?
มีวิธีง่ายๆใน C # เพื่อตรวจสอบว่าอินสแตนซ์ DateTime ได้รับการกำหนดค่าหรือไม่?
คำตอบ:
วิธีเดียวในการมีตัวแปรที่ยังไม่ได้กำหนดค่าใน C # คือการเป็นตัวแปรท้องถิ่นซึ่งในกรณีนี้ในเวลาคอมไพล์คุณสามารถบอกได้ว่ามันไม่ได้ถูกกำหนดอย่างแน่นอนโดยพยายามอ่านจากมัน: )
ฉันสงสัยว่าคุณต้องการจริงๆNullable<DateTime>
(หรือDateTime?
ด้วยน้ำตาลไวยากรณ์ C #) - null
เริ่มต้นด้วยจากนั้นกำหนดDateTime
ค่าปกติ(ซึ่งจะถูกแปลงอย่างเหมาะสม) จากนั้นคุณสามารถเปรียบเทียบกับnull
(หรือใช้HasValue
คุณสมบัติ) เพื่อดูว่ามีการตั้งค่า "จริง" หรือไม่
default(DateTime)
และค่าที่เป็นเพียงวิธีเริ่มต้น โดยทั่วไปจะถือว่าค่าหนึ่งภายในโดเมนเป็น "พิเศษและไม่สามารถใช้งานได้ตามปกติ" ซึ่งฉันไม่ชอบ
คุณหมายถึงอย่างนั้นเหรอ:
DateTime datetime = new DateTime();
if (datetime == DateTime.MinValue)
{
//unassigned
}
หรือคุณสามารถใช้ Nullable
DateTime? datetime = null;
if (!datetime.HasValue)
{
//unassigned
}
วางไว้ที่ใดที่หนึ่ง:
public static class DateTimeUtil //or whatever name
{
public static bool IsEmpty(this DateTime dateTime)
{
return dateTime == default(DateTime);
}
}
แล้ว:
DateTime datetime = ...;
if (datetime.IsEmpty())
{
//unassigned
}
IsEmpty
เมธอดของคุณจะคืนค่าจริงซึ่งอาจไม่ใช่สิ่งที่คุณต้องการ (เพราะไม่ว่างเปล่า - ถูกกำหนดค่าเริ่มต้น) IsDefaultValue
ผมคิดว่าชื่อของวิธีการของคุณจะมากขึ้นตามความเหมาะสม เนื่องจากคุณไม่สามารถจริงๆมี DateTime ไม่ใช่ nullable IsEmpty
ว่า
IsDefaultValue
คงจะดีขึ้น
DateTime เป็นชนิดของค่าดังนั้นจึงไม่สามารถเป็นค่าว่างได้ ถ้าคุณคิดว่า DateTime? (Nullable) คุณสามารถใช้:
DateTime? something = GetDateTime();
bool isNull = (something == null);
bool isNull2 = !something.HasValue;
ฉันเพิ่งพบว่า GetHashCode () สำหรับวันที่และเวลาที่ไม่ได้กำหนดเป็นศูนย์เสมอ ฉันไม่แน่ใจว่านี่เป็นวิธีที่ดีในการตรวจสอบวันที่และเวลาว่างหรือไม่เพราะฉันไม่พบเอกสารใด ๆ ว่าเหตุใดจึงแสดงพฤติกรรมนี้
if(dt.GetHashCode()==0)
{
Console.WriteLine("DateTime is unassigned");
}
GetHashCode
ผลตอบแทน 0 เพราะเห็บ (แทนภายในของ DateTime) นอกจากนี้ยังเท่ากับ 0. unchecked((int)ticks) ^ (int)(ticks >> 32);
รหัสแฮคำนวณโดยวิธีการดังต่อไปนี้: โปรดดูที่นี่: referencesource.microsoft.com/#mscorlib/system/datetime.cs,836
ใช้Nullable<DateTime>
ถ้าเป็นไปได้
new DateTime()
ผมว่าค่าเริ่มต้นอยู่เสมอ เราจึงเขียนได้
DateTime datetime;
if (datetime == new DateTime())
{
//unassigned
}
โดยทั่วไปฉันชอบที่จะใช้ค่าเริ่มต้นของประเภทค่าเพื่อพิจารณาว่าได้ตั้งค่าไว้หรือไม่ เห็นได้ชัดว่าสิ่งนี้ไม่สามารถทำได้ตลอดเวลาโดยเฉพาะอย่างยิ่งกับ ints - แต่สำหรับ DateTimes ฉันคิดว่าการจอง MinValue เพื่อแสดงว่าไม่มีการเปลี่ยนแปลงนั้นยุติธรรมเพียงพอ ข้อดีของสิ่งนี้ในช่วง nullables คือมีสถานที่น้อยกว่าหนึ่งแห่งที่คุณจะได้รับข้อยกเว้นการอ้างอิงที่เป็นโมฆะ (และอาจมีหลายที่ที่คุณไม่ต้องตรวจสอบค่าว่างก่อนเข้าถึง!)
หากคุณไม่ต้องการที่จะต้องกังวลกับปัญหาค่า Null เช่นการตรวจสอบค่าว่างทุกครั้งที่คุณใช้มันหรือรวมเข้าด้วยกันในตรรกะบางอย่างและคุณไม่ต้องการที่จะต้องกังวลเกี่ยวกับปัญหาเวลาชดเชยนี่คือ ฉันจะแก้ปัญหาได้อย่างไร:
startDate = startDate < DateTime.MinValue.AddDays(1) ? keepIt : resetIt
ฉันเพิ่งตรวจสอบว่าค่าเริ่มต้นน้อยกว่าหนึ่งวันหลังจากเวลาเริ่มต้น ใช้งานได้เหมือนมีเสน่ห์