سؤال

أريد أن أعرف التلبيس في ج#. صافي ، لدي أسطر أدناه من التعليمات البرمجية.

int i=4
object o = i // This works properly without any typecasting becausing boxing takes place automatically
string s= i // This does not work, even when the string is also reference type?
string s=(string)i //This also does not work even if i try to typecast the int to string.
string s= Convert.ToString(i); // this works.

لذلك أريد أن أعرف لماذا string s = i and string s = (string)i لا يعمل وما الفرق في استخدام (string)i, i.ToString(), and Convert.ToString(i).

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

المحلول

عندما يتعلق الأمر بالملاكمة وإلغاء الملاكمة ، فإن الأنواع لها صب صريح وضمني.لذلك ، في بعض الظروف ، فمن السهل بما فيه الكفاية لوقت التشغيل للسماح للتحويل الضمني بين نوعين المدعومة ، ويقول إنت 32 إلى ضعف.ومع ذلك ، لا يوجد تحويل ضمني أو صريح بين عدد صحيح وسلسلة ، لأنه من الواضح أن السلسلة ليست عددا صحيحا (على الرغم من حقيقة أن السلسلة يمكن أن تحتوي على أحرف لعدد صحيح).

string s = i; // attempt at implicit cast from Int32 to String, error
object o = i; // all types inherit from Object, so you may implicitly or explicitly cast from Int32 to Object.
s = (string)i; // attempt at explicit cast from Int32 to string, error
s = i.ToString(); // conversion
s = Convert.ToString(i); // conversion

هذا هو المكان Convert يأتي للعب. Convert يحتوي على دعم لمحاولة تحويل الأوليات المعروفة (وأنواع الدعم IConvertable) إلى آخر.لذا, ToString أو Convert.ToString ستكون الطرق المفضلة (توسترينغ وتحويل.توسترينغ هي مرادفة تقريبا ، إلا أن توسترينغ يمنحك بعض خيارات التنسيق).

نصائح أخرى

حسنا, string و object - كلاهما أنواع مرجعية.ومع ذلك, object هو نوع الجذر لجميع أنواع صافي.

عند استخدام بناء الجملة مثل (string)i, ، أنت تحاول استخدام أنواع التحويل الصريحة بين.لكن هذا النوع من التحويل يتطلب string فئة لمعرفة جميع أنواع الوسيطة الممكنة.

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

سلسلة س = أنا وسلسلة س = (سلسلة)أنا لا يعمل

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

ما الفرق في استخدام (سلسلة)ط ، ط. توسترينغ () ، وتحويل.توسترينج (أنا).

  • (سلسلة) أنا:يلقي أنا إلى سلسلة ، يجب أن يكون التنازل.

  • ط. توسترينغ():يدعو طريقة توسترينغ ، وهو ديفيند على النظام.كائن ، وبالتالي متاح في جميع الفئات والبنى-ولكن لا يرجع أي محتوى معقول إذا لم يتم الكتابة فوقه.

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

في النهاية ، الصب ليس كذلكالتحويل.ل (سلسلة) أنا للعمل يجب أن أكون سلسلة ، في حين يحاول تحويل لجعله سلسلة.

يمكنك تحديد التحويلات الضمنية والصريحة في صافي ، والسبب في أن سلسلة س = أنا فشل هو أنه لا يوجد بنيت في عملية الزهر لعدد صحيح إلى سلسلة.

انظر هذا المادة مسن على الصب لمزيد من المعلومات

string s= i لا يعمل لأن أنواع لا تتطابق ، إنت لن تذهب إلى سلسلة.

string s=(string)i لا يعمل لأنه لا يمكن أن يفترض نوع التحويل الذي سيتم استخدامه (أي أي قاعدة)

شيء من هذا القبيل s = ""+i ستعمل من ناحية أخرى لأنها ستفترض التحويل الأساسي 10.

لذلك أريد أن أعرف لماذا string s = i و string s = (string)i لا يعمل

الجواب القصير هو أنه لا يوجد أي ضلوع (المثال الأول أعلاه) ولا صريح (المثال الثاني أعلاه) يلقي من كثافة العمليات إلى سلسلة محددة.إجابة أطول قليلا;عند تأليف الهيكل Int32 في ج # لم تتم برمجة أي سلوك صب لتمكين المطور من الإرسال التلقائي من كثافة العمليات إلى سلسلة

ما الفرق في استخدام (string)i, i.ToString(), ، و Convert.ToString(i)

حسنا ، الأول لا يعمل كما قلت ، وكما أوضحت أعلاه.الثاني يدعو ToString طريقة على الهيكل Int32, ، والتي ترجع (كما يوحي الاسم) تمثيل سلسلة للكائن.وتجدر الإشارة إلى أن هذه سلسلة جديدة تماما ، ولا تتعلق بأي شكل من الأشكال بالقيمة الأصلية.المثال الثالث Convert.ToString سوف ، تحت غطاء محرك السيارة ، استدعاء أيا كانت الطريقة الأنسب لتحويل المعلمة التي تم تمريرها إلى سلسلة-على الأرجح يدعو فقط ToString الطريقة-متطابقة إلى حد كبير مع المثال 2.

ToString() يتم تجاوز الطريقة بكل مرجع وهو أسلوب حيوي في فئة الكائن.سلسلة كالس تجاوز هذا الأسلوب وتوفير قيمة سلسلة للخروج من هذا.

يؤدي التنفيذ الافتراضي لطريقة توسترينج إلى إرجاع الاسم المؤهل بالكامل لنوع الكائن ، كما يوضح المثال التالي.

 Object obj = new Object();
      Console.WriteLine(obj.ToString());

// The example displays the following output:
//      System.Object

يتم توريث هذا السلوك بواسطة أنواع المراجع التي لا تتجاوز طريقة توسترينج.

التلبيس في ج # يعمل فقط على غرار الميراث الطبقي.الكائن هو جذر جميع الأنواع في ج # وبالتالي يمكن تلبيس جميع القيم إليه.

string و int لا تشترك في نفس فرع الميراث وبالتالي لا يمكن أن يلقي مباشرة من واحد إلى آخر.

Convert.ToString() هي طريقة مصممة لتحويل عدد صحيح إلى سلسلة - لا يوجد تلبيس يحدث ، انها مجرد تنفيذ طريقة مصممة لتحويل عدد صحيح إلى تمثيل سلسلة.

i.ToString() يؤدي وظيفة مكافئة ل Convert.ToString(), ، باستثناء ذلك i.ToString() يحتوي على حمولات زائدة تتيح مرونة أكبر في تمثيل الرقم بتنسيق السلسلة.

ملاحظة أخيرة ، يمكن للمطور تضمين استثناءات لقواعد التلبيس باستخدام ملف public static explicit operator الطريقة التي تسمح للمطور بتحويل قيمة إلى أخرى على النحو الذي يراه مناسبا.

أول شيء يجب ملاحظته هو أن كل فئة مشتقة من الكائن.

صب إنت إلى كائن يستخدم إنت 32.

صب سلسلة إلى كائن يستخدم سلسلة.

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

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

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