سؤال

في C ++ هناك الكثير من الطرق التي يمكنك كتابة التعليمات البرمجية التي تجمع، ولكن الغلة سلوك غير محدد (ويكيبيديا). وبعد هل هناك شيء مماثل في C #؟ هل يمكننا كتابة التعليمات البرمجية في C # التي تجمع، ولكن لديها سلوك غير محدد؟

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

المحلول

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

تتمتع حالة الزاوية بشعبة عدد صحيح بسلوك محدد بالتنفيذ.

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

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

http://blogs.msdn.com/ericlippert/archive/2006/04/06/OODION- Sampigation-overloads-part-two.aspx.

ومع ذلك، يجب أن تكون المواقف التي يكون فيها برنامج C # آمن وتصرف جيدا سلوكا تعريف التنفيذ نادرا للغاية.

نصائح أخرى

نعم! هناك، حتى في سياق آمن! (حسنا، من المحدد في التنفيذ أنه غير محدد، على الأقل)

إليك واحدة من ماريك سفار ومصادوف في قضايا روسلين. هناك عدم تطابق بين C # و CLI فيما يتعلق bool.

C # يعتقد أن هناك نوع واحد فقط من true, ، ونوع واحد من false.

CLI يعتقد ذلك false هو البايت الذي يحتوي على 0، وجميع القيم الأخرى true.

هذا التناقض يعني أننا نستطيع إكراه C # للقيام به بعض (هامشي) مثيرة للاهتمام أشياء شيء:

//non-standard bool
//We're setting a bool's value to a byte value of 5.
var a = new bool[1];
Buffer.SetByte(a, 0, 5);

//non-standard bool
//We're setting a bool's value to a byte value of 10.
var b = new bool[1];
Buffer.SetByte(b, 0, 10);

//Both are true.
Console.WriteLine(a[0]);
Console.WriteLine(b[0]);

//But they are not the same true.
Console.WriteLine(a[0] == b[0]);

المخرجات أعلاه:

true

true

false

ومن المثير للاهتمام، يختلف مصحح الأخطاء (يجب تقييم الحقيقة بشكل مختلف؟)

enter image description here

على أي حال، فإن الاستنتاج يبدو أن فريق C # قد جاء إليه هو (التركيز المضافة):

أي اللغة ستبقى غير مهتم تماما عن المرصود غير القياسية. سوف يعترف التنفيذ الخاص (كما هو الحال في MS C # ON CIL) بوجود المرض غير القياسي وتحديد سلوكهم غير معرف

بالنظر إلى الويكي، فإن المواقف التي يحدث فيها سلوك غير محدد يحدث إما غير مسموح بها أو رمي استثناء في C #.

ومع ذلك في قانون غير آمن، سلوك غير محدد وأعتقد أنه ممكن، كما يتيح لك استخدام المؤشرات وما إلى ذلك.

تحرير: يبدو أنني صحيح: http://msdn.microsoft.com/en-us/library/aa664771٪28VS.71٪29.aspx.

لديه مثال على السلوك غير محدد في C #

وفقا لمستند ECMA-334 (ص 473):

لا يتضمن برنامج لا يحتوي على أي تكرارات من معدل غير آمن على أي سلوك غير محدد.

التي تعزز "المعرفة بالتنفيذ" إلى أسوأ الحالات، انظر إجابة Eric Lippert.

العديد من البرامج الفرعية لها متطلبات يمكن تلخيصها على النحو التالي:

  1. عند إعطاء بيانات صالحة، إنتاج إخراج صالح.

  2. الامتناع عن إطلاق الصواريخ النووية أو نفي قوانين الوقت والسببية، حتى عند إعطاء إدخال غير صالح.

أحد أهداف التصميم الرئيسية ل JAVA و. لغات Java. Finalize يمكن أن يكون غريبة بعض الشيء من وجهة نظر الوقت / السببية، يمكن وصف تلك الاستثناءات على قواعد السببية الطبيعية، بدلا من الإلغاء الكامل لهم]. يختلف هذا الوضع تماما عن الوضع في ج، حيث قد تؤدي العديد من أنواع الأخطاء التي تعتمد على البيانات (مثل تجاوز عدد الأعداد الصحيحة) إلى المترجمات التي تتصرف في الأزياء التعسفية بما في ذلك جعل أي افتراضات ستكون ضرورية لتجنب تجاوز الفضاء. الأنواع الرهيبة حقا من السلوك غير محدد والتي يتم تشجيعها في فلسفة HyperModern C غير موجودة في C # أو لغات .NET الأخرى خارج كتل "غير آمنة".

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

بشكل عام أود أن أقول لا.

استخدم المتغير التلقائي قبل تهيئة.

يجب تهيئة جميع المتغيرات. إذا لم يحدث استثناء.

القسمة على صفر

يتم إلقاء الاستثناء.

فهرسة مجموعة من الحدود

يتم طرح استثناء

كما أشار Atequitarum Custos، يمكنك استخدام رمز غير آمن. ثم مرة أخرى، هذا ليس حقا C #، فأنت تختار صراحة من بيئة C #.

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