سؤال

لدي فئة تحتوي على عدد من الخصائص، مثل:

public class Update
{
    public int Quantity { get; set; }
    public decimal Price { get; set; }
    public string Name { get; set; }
}

كل مثيل Update ليس بالضرورة أن يتم تعيين كل خاصية، ويحتاج جزء آخر من النظام إلى معرفة ما تم تعيينه وأيها لم يتم تعيينه.

أحد الخيارات المتاحة أمامي هو إنشاء جميع أنواع القيم Nullable وهكذا أ null القيمة ستمثل مفهوم عدم التعيين.في حين أن هذا قد ينجح، إلا أنني لا أحب حقًا فكرة وجود بعض الخصائص بشكل صريح Nullable (أنواع القيمة) وبعضها لاغية بحكم كونها نوع مرجعي.سيبدو تعريف الفصل قبيحًا ولست مقتنعًا بأن التحقق من القيمة الفارغة هو أفضل نهج لغويًا.

يمكنني إنشاء فئة مشابهة جدًا لـ Nullable<T> التي ليس لها قيد على T مع ال IsSet ملكية.أفضّل هذا الخيار على الاستخدام Nullable, ، ولكني ما زلت أرغب في معرفة ما إذا كان لدى أي شخص تمثيل بديل أفضل من الخيارات التي اقترحتها.

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

المحلول

يجب عليك حقًا الالتزام بالمصطلح الموجود مسبقًا هنا.استخدم القابلية للإلغاء المضمنة.

أرى أن قلقك بشأن اختلاف القابلية للإلغاء بالنسبة لأنواع القيمة والمراجع.الحل البديل الخاص بك سوف يعمل.لكنه مجرد تغيير تجميلي يكسبك القليل.أنصحك بتغيير نفسك بدلاً من تغيير الكود في هذه الحالة.حاول أن تناسب نفسك مع الاتفاقيات الحالية.

يحرر:في بعض الأحيان تحتاج إلى أن تكون قادرًا على جعل القيمة اختيارية في التعليمات البرمجية العامة.في هذه الحالة تحتاج إلى استخدام بعض أنواع الخيارات المخصصة.من خلال التجربة أستطيع أن أقول أن هذا أمر سيء جدًا للاستخدام.إنه ليس الحل الذي أختاره.

نصائح أخرى

الأنواع المرجعية هي بالفعل لاغية، على نحو فعال - إذا كنت تستخدم int?, decimal? و string عندها يمكن أن تكون كل خاصية من خصائصك فارغة.

المشكلة تأتي إذا كنت ترغب في تعيين string القيمة إلى مرجع فارغ - إذا كانت القيمة الخالية قيمة صالحة فعليًا يكون تعيين.

أنت بالتأكيد استطاع اكتب Maybe<T> اكتب، لكنني لست متأكدًا من أنني سأفعل - سأفعل من المحتمل مجرد استخدام فارغة ...بصرف النظر عن أي شيء آخر، سيكون الأمر أكثر دراية للآخرين الذين يقرؤون الكود والذين اعتادوا على مصطلحات C#.لجميع المشاعر "المناهضة للصفر" حولها (والتي أ يفعل المشاركة في العديد من المواقف) هناك حالات يكون فيها هذا هو النهج الأبسط.

أنا لا أحب فكرة وجود بعض الخصائص (أنواع القيمة) وبعضها لا (أنواع المرجع)

من الواضح أن أنواع المراجع لاغية.

string t = null; //is totally valid

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

لأقترح عليك شيئا جديدا...إذا كنت تتحدث فقط عن فئة واحدة مثل التحديث مع عدد محدود من الأعضاء، فسأستخدم IsSet فقط.

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

يمكنني أن أصف ذلك أكثر إذا كان الشخص مهتمًا ...

الحل هنا ل

  • استخدم nullable عندما لا يكون null خيارًا صالحًا
  • استخدم قيمة افتراضية عندما يكون null خيارًا صالحًا ولكنك متأكد تمامًا من عدم حدوث قيمة معينة
  • استخدم علامة منطقية لكل خاصية حيث تكون القيمة الخالية قيمة صالحة ولا يمكنك تسمية قيمة افتراضية لن يتم استخدامها أبدًا.

أمثلة:يجب أن تكون الكمية فارغة، لأنه إذا تم ضبطها فلن تكون قيمتها فارغة أبدًا

يجب تعيين الاسم بشكل افتراضي إلى "" إذا كان الاسم خاليًا (عدم وجود اسم) وكنت متأكدًا من أن الاسم لن يكون أبدًا ""

لنفترض أنه يجب استخدام علامة nameSet إذا كان الاسم يحتوي على قيمة فارغة ولا يمكنك التفكير في قيمة افتراضية.ستكون هذه العلامة خاطئة افتراضيًا، وعندما تقوم بتعيين قيمة الاسم لأول مرة، يجب تعيين العلامة على صواب أيضًا.

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

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