type - C#"as" cast to classic cast




user defined data types in c# (7)

ممكن تكرار:
Casting vs باستخدام الكلمة "as" في CLR

تعلمت مؤخرا عن طريقة مختلفة للإدلاء بها. بدلا من استخدام

SomeClass someObject = (SomeClass) obj;

يمكن للمرء استخدام هذا النحو:

SomeClass someObject = obj as SomeClass;

الذي يبدو أنه يُرجع null إذا لم يكن obj عبارة عن SomeClass ، بدلاً من طرح استثناء فئة مميزة.

أرى أن هذا يمكن أن يؤدي إلى NullReferenceException إذا فشل الإرسال وحاول الوصول إلى متغير someObject. لذلك أنا أتساءل ما هو الأساس المنطقي وراء هذه الطريقة؟ لماذا يجب على المرء استخدام هذه الطريقة في الاختيار بدلاً من الطريقة (القديمة) - يبدو أنه يؤدي إلى تحريك مشكلة "فشل" أعمق في التعليمة البرمجية.

https://code.i-harness.com


أعتقد أن أفضل "قاعدة" هي استخدام الكلمة الرئيسية "كـ" فقط عندما يُتوقع أن لا يكون هدفك هو الكائن الذي تنتقل إليه:

var x = GiveMeSomething();

var subject = x as String;

if(subject != null)
{
  // do what you want with a string
}
else
{
  // do what you want with NOT a string
}

ومع ذلك ، عندما يكون موضوعك من النوع الذي يتم الإرسال إليه ، استخدم "cast كلاسيكي" ، كما تسميها. لأنه إذا لم يكن من النوع الذي تتوقعه ، فستحصل على استثناء يناسب الموقف الاستثنائي.


أفترض أنه من المفيد إذا تم تمرير نتيجة cast إلى أسلوب تعلم أنه سيعالج المراجع الخالية بدون الرمي و ArgumentNullException أو likelike.

لا أجد إلا القليل جدًا من الاستخدام لـ ، حيث:

obj as T

أبطأ من:

if (obj is T)
    ...(T)obj...

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


باستخدام الطريقة "الكلاسيكية" ، إذا فشل الإرسال ، يتم طرح استثناء. باستخدام الطريقة ، ينتج عنها قيمة فارغة ، والتي يمكن التحقق منها ، وتجنب حدوث استثناء.

أيضًا ، يمكنك فقط استخدام "كـ" مع أنواع المراجع ، لذلك إذا كنت تقوم بتلبيس النوع إلى نوع القيمة ، فيجب عليك استخدام الطريقة "الكلاسيكية".

ملحوظة:

يمكن استخدام الطريقة فقط للأنواع التي يمكن تخصيص قيمة null . هذا الاستخدام يعني فقط أنواع المراجع ، ولكن عندما ظهر .NET 2.0 ، فإنه قدم مفهوم نوع قيمة nullable. بما أن هذه الأنواع يمكن تخصيص قيمة null ، فهي صالحة للاستخدام مع المشغل.


تكون الكلمة الأساسية مفيدة عندما لا تعرف نوع المتغير. إذا كانت لديك وظيفة واحدة تتبع مسارات شفرة مختلفة بناءً على النوع الفعلي للمعلمة ، فحينئذٍ يكون لديك خياران:

أولاً ، استخدام طاقم التمثيل العادي:

if(myObj is string)
{
    string value = (string)myObj;

    ... do something
}
else if(myObj is MyClass)
{
    MyClass = (MyClass)myObj;
}

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

البديل هو استخدام.

string myString = myObj as string;
MyClass myClass = myObj as MyClass;

if(myString != null)
{

}
else if(myClass != null)
{

}

هذا يجعل الرمز أقصر إلى حد ما وكذلك يلغي التحقق من نوع مكرر.


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

عندما تتوقع أن يعمل المصبوب وتريد طرح الاستثناء ، استخدم الطريقة "الكلاسيكية".


مقارنة فارغة هي أسرع بكثير من رمي والاستيلاء على الاستثناء. الاستثناءات لها حد فائق - يجب تجميع التجميع المكدس الخ.

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


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





casting