سؤال

لماذا لا يُسمح بتعيين قيمة فارغة لـ DateTime في C#؟كيف تم تنفيذ ذلك؟وهل يمكن استخدام هذه الميزة لجعل الفصول الدراسية الخاصة بك غير قابلة للإلغاء؟

مثال:

string stringTest = null; // Okay
DateTime dateTimeTest = null; // Compile error

وأنا أعلم أنه يمكنني استخدامها DateTime? في C# 2.0 للسماح بتعيين قيمة فارغة إلى dateTimeTest والتي يمكنني استخدامها فئة جون سكيت NonNullable على سلسلتي للحصول على خطأ وقت التشغيل عند تعيين stringTest.أنا فقط أتساءل لماذا يتصرف النوعان بشكل مختلف.

هل كانت مفيدة؟

المحلول

وDateTime هو من نوع قيمة (struct)، حيث كما هو السلسلة من نوع المرجعية (class الخ). هذا هو الفرق الرئيسي. إشارة يمكن أن يكون دائما لاغيا. قيمة لا يمكن (إلا اذا كان يستخدم Nullable<T> - أي DateTime?) (. إسبانيا في 1.1)، على الرغم من أنه يمكن zero'd (DateTime.MinValue)، والتي غالبا ما تفسر على أنها نفس الشيء لاغيا

نصائح أخرى

والتاريخ والوقت هو البنية وليس فئة. لا أحد 'الذهاب إلى تعريف "أو ننظر في المستعرض الكائن لنرى.

وHTH!

الفرق المهم بين ValueTypes وأنواع المراجع هو أن أنواع القيم لها "دلالات القيمة".ليس لدى DateTime وInt32 وجميع أنواع القيم الأخرى هوية، ولا يمكن تمييز Int32 "42" بشكل أساسي عن أي Int32 آخر له نفس القيمة.

جميع "كائنات" نوع القيمة موجودة إما على المكدس أو كجزء من كائن نوع مرجعي.إحدى الحالات الخاصة هي عندما تقوم بإرسال مثيل نوع القيمة إلى كائن أو واجهة - وهذا ما يسمى "الملاكمة"، ويقوم ببساطة بإنشاء كائن من النوع المرجعي الوهمي الذي يحتوي فقط على القيمة التي يمكن استخراجها مرة أخرى ("غير معلبة") .

من ناحية أخرى، الأنواع المرجعية لها هوية."كائن جديد ()" لا يساوي أي "كائن جديد ()" آخر، لأنه عبارة عن مثيلات منفصلة في كومة GC.توفر بعض أنواع المراجع طريقة Equals وعوامل تشغيل مثقلة بحيث تتصرف بشكل أقرب إلى القيمة، على سبيل المثال.السلسلة "abc" تساوي سلسلة "abc" أخرى حتى لو كانا في الواقع كائنين مختلفين.

لذلك عندما يكون لديك مرجع، فيمكن أن يحتوي إما على عنوان كائن صالح، أو يمكن أن يكون خاليًا.عندما تكون كائنات نوع القيمة صفرًا، فهي ببساطة صفر.على سبيل المثال.عدد صحيح صفر، أو صفر عائم، أو خطأ منطقي، أو DateTime.MinValue.إذا كنت تريد التمييز بين "صفر" و"قيمة مفقودة/خالية"، فأنت بحاجة إلى استخدام علامة منطقية منفصلة، ​​أو الأفضل من ذلك، استخدام فئة Nullable<T> في .NET 2.0.وهي ببساطة القيمة بالإضافة إلى علامة منطقية.يوجد أيضًا دعم في CLR بحيث يؤدي وضع Nullable مع HasValue=false إلى مرجع فارغ، وليس في بنية محاصر مع false+صفر، كما لو كنت ستنفذ هذه البنية بنفسك.

والتاريخ والوقت هو نوع قيمة، نفس عدد صحيح. أنواع المراجع فقط (مثل سلسلة أو MyCustomObject) يمكن أن تكون فارغة. أنواع المراجع تخزين حقا "المراجع" إلى موقع الكائنات على الكومة.

وهنا وجدت أن يفسر على نحو أفضل. وهنا تكمن MSDN المادة على أنه

لمن نوع قيمة أن يكون لاغيا، يجب أن يكون هناك بعض القيمة التي يمكن أن تعقد التي لن يكون لها أي معنى شرعي آخر، و الذي ينبغي أن ينظر إلى النظام سوف تعرف بطريقة أو بأخرى بأنها "باطلة" . بعض أنواع قيمة يمكن أن تلبي المعيار الأول دون الحاجة إلى أي تخزين إضافية. إذا الصافية قد تم تصميمها من الألف إلى الياء مع مفهوم القيم قيم الفارغة في الاعتبار، فإنه يمكن أن يكون قد Object include a virtualIsLogicalNullproperty, and a non-virtualIsNullwhich would returntrueifthisis null and, otherwise invoke itsIsLogicalNullproperty and return the result. If .net had done this, it would have avoided the need for the quirky boxing behavior andstructconstraint ofNullable(an emptyNullablecould be boxed as an emptyNullable, and still be recognized asnull`).

وبحلول الوقت الذي تقرر تقديم الدعم لأنواع قيمة قيم الفارغة في إطار صافي 2.0، ومع ذلك، فإن الكثير من التعليمات البرمجية تم كتابة التي يفترض أن القيم الافتراضية لأشياء مثل Guid وDateTime لن تعتبر null. منذ بكثير من القيمة في أنواع nullable تقع على عاتق القيمة الافتراضية يمكن التنبؤ بها (أي null)، وجود أنواع التي كان لها قيمة null، ولكن تعثر على شيء آخر، من شأنه أن يضيف المزيد من الارتباك من القيمة.

والسلسلة فئة في حين التاريخ والوقت هو بنية. ولهذا السبب لا يمكن تعيينها فارغة

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top