سؤال

المشاكل هي:

  • مكتبات واجهة المستخدم الرسومية ترغب في استخدامها ToString كتمثيل افتراضي للفئات.هناك يجب أن تكون محلية.
  • ToString يستخدم للتسجيل.هناك يجب أن توفر معلومات متعلقة بالبرمجة، ولا تتم ترجمتها وتتضمن حالات داخلية مثل المفاتيح البديلة وقيم التعداد.
  • ToString يتم استخدامه من قبل العديد من عمليات السلسلة التي تأخذ الكائنات كوسائط، على سبيل المثال String.Format, ، عند الكتابة إلى التدفقات.اعتمادا على السياق تتوقع شيئا مختلفا.
  • ToString محدود للغاية إذا كان هناك العديد من التمثيلات المختلفة لنفس الكائن، على سبيل المثال.شكل طويل وقصير.

بسبب الاستخدامات المختلفة، هناك العديد من أنواع التنفيذ المختلفة.لذا فهي غير موثوقة جدًا بحيث لا تكون مفيدة حقًا.

كيف ينبغي ToString سيتم تنفيذها لتكون مفيدة؟عندما يجب ToString استخدامها، ومتى يجب تجنبها؟


ال وثائق .NET Framework يقول:

هذه الطريقة تُرجع سلسلة قابلة للقراءة البشرية حساسة للثقافة.

هناك سؤال مماثل, ، ولكن ليس نفس الشيء.

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

المحلول

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

هنا اقتراحاتي:

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

نصائح أخرى

وهنا مقالة لطيفة تشرح تجاوز System.Object.ToString() وتنفيذ IFormattable

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

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

قد ترغب أيضًا في التفكير في جعل القيمة التي يتم إرجاعها بواسطة ToString قابلة للتحليل بحيث يمكنك إنشاء كائن من تمثيل سلسلة.كما يمكنك فعله باستخدام طريقة Int32.Parse.

هناك مشكلة أخرى يجب مراعاتها وهي التكامل المحكم بين مصحح أخطاء ToString وVisual Studio.تعرض نافذة المراقبة نتيجة ToString كقيمة للتعبير، لذلك إذا كانت طريقتك تقوم بأي تحميل بطيء، أو لها أي آثار جانبية، أو تستغرق وقتًا طويلاً، فقد ترى سلوكًا غريبًا أو قد يبدو مصحح الأخطاء معطلاً .من المؤكد أن هذه الصفات ليست علامة على طريقة ToString المصممة جيدًا، ولكنها تحدث (على سبيل المثال.تطبيق ساذج "جلب الترجمة من قاعدة البيانات").

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

بينما يستفيد المطلعون من سمات تصحيح الأخطاء (DebuggerTypeProxyAttribute وDebuggerDisplayAttribute وDebuggerBrowsableAttribute) لتخصيص مصحح الأخطاء، يعتبر الكثيرون (بما فيهم أنا) بشكل عام أن الإخراج الافتراضي الذي تم إنشاؤه بواسطة ToString ويتم عرضه في نوافذ المراقبة جيد بما فيه الكفاية.

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

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

على أية حال، إليك بعض الحالات التي يكون فيها ذلك منطقيًا (ليست قائمة شاملة):

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

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

لذلك لا يوجد تعارض لأنه لا ينبغي أن يكون من نفس النوع وفقا لمبدأ المسؤولية الفردية.

تذكر أنه يمكنك دائمًا زيادة تحميل طريقة ToString إذا كنت بحاجة إلى مزيد من التحكم.

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