C#:فائدة ذكر صراحة "غير آمنة" / برنامج التحويل البرمجي الخيار

StackOverflow https://stackoverflow.com/questions/607159

سؤال

أنا أفهم مؤشرات نادرة تحتاج إلى استخدامها في التعليمات البرمجية C#.سؤالي هو:ما هو المنطق وراء الحاجة إلى صراحة "غير آمنة" في كتلة من التعليمات البرمجية.بالإضافة إلى ذلك, لماذا يجب مترجم خيار تغيير السماح "غير آمنة" الرمز ؟

خلاصة القول: ما في CLR (أو اللغة المواصفات) يجعل من ذلك لا يمكننا استخدام مؤشرات كلما أردنا (مثل C و C++) دون الحاجة إلى كتابة "غير آمنة" وتغيير برنامج التحويل البرمجي الخيار ؟

للتوضيح:أنا أعرف ما "غير آمنة" و "آمنة" رمز.إنه مجرد سؤال: لماذا يجب علينا أن نفعل كل عمل إضافي (حسنا, ليس كثيرا إضافية) لمجرد أن يكون قادرا على استخدام هذه الميزات.

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

المحلول

هناك مقابلة مع C# الخالق أندرس هيلسبرغ أن اللمسات على الموضوع هنا.أساسا بالضبط ما @مارك Gravell قال:typesafety الأولى مأمونة من خلال الإعلان الصريح.

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

تحرير:

للتوضيح:أنا أعرف ما "غير آمنة" و "آمنة" رمز.انها مجرد سؤال: لماذا يجب علينا أن نفعل كل العمل الإضافي (حسنا, ليس كثيرا إضافية) مجرد أن تكون قادرة على استخدام هذه الميزات.

كما ذكر في المقابلة أنا مرتبط كانت صريحة تصميم المقرر.C# هو أساسا تطور جافا في جافا, لا تملك مؤشرات على الإطلاق.ولكن المصممين أراد أن تسمح مؤشرات;ومع ذلك لأن C# عادة في جلب مطوري جافا, شعرت أنه سيكون من الأفضل إذا كان الافتراضي السلوك تكون مشابهة جافا ، أيلا مؤشرات ، في حين لا يزال يسمح استخدام مؤشرات من خلال الإعلان الصريح.

وبالتالي فإن "العمل الإضافي" هو متعمد أن يجبرك على التفكير في ما كنت تفعل قبل أن تفعل ذلك.من خلال كونها صريحة ، فإنه يفرض عليك أن تنظر على الأقل:"لماذا أفعل هذا ؟ لا حقا تحتاج المؤشر عند إشارة نوع كافية؟"

نصائح أخرى

وهو الى حد كبير عن كونها قابلة للتحقق. بالقول unsafe، قفازات هي من - النظام لم تعد قادرة على ضمان أن التعليمات البرمجية لن تعيث في الأرض فسادا. في معظم الحالات هو مرغوب فيه للغاية للبقاء في المنطقة الآمنة.

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

والواقع أن CLR يجعل أي متطلبات على الإطلاق حول التبديل / غير آمنة أو الكلمة. في الواقع، C ++ / CLI (لغة C ++ الذي يعمل تحت CLR) لا يوجد لديه مثل هذا التبديل / غير آمنة، ومؤشرات يمكن استخدامها بحرية على CLR.

ولذا أود أن أعيد صياغة سؤالك ب "لماذا C # تتطلب استخدام / غير آمنة قبل مؤشرات يمكن استخدامها؟" والجواب على هذا السؤال هو كما ذكر في إجابات أخرى نظرا هنا: لمساعدة المستخدم على اتخاذ قرار واع لتفقد القدرة على تشغيل في أي شيء أقل من وضع الثقة الكاملة في CLR. C ++ يتطلب دائما تقريبا ثقة كاملة في CLR، وC # <م> يمكن كلما استدعاء التعليمات البرمجية التي تتطلب ثقة كاملة، أو كلما كنت تستخدم المؤشرات.

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

التفكير في الأمر من وجهة نظر الآخر:لأنه لم يتم وضع علامة آمن ، يمكن أن نستنتج أن معظم رمز "آمنة" بشكل افتراضي.ماذا يعني أن تكون "آمن" ؟ ل .صافي رمز ، ويشمل ذلك (ولكن لا تقتصر على):

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

في أي وقت يمكنك استخدام مؤشرات لديك فرصة لكسر أي من تلك الضمانات.ولذلك وسم الكود كما آمنة يتخلى عن تلك الحماية.

باختصار .صافي يريد منك أن الدولة القصد الخاص.

بالتأكيد, مترجم يمكن أن نستنتج ضرورة "غير آمنة" العلم.ولكن المصممين تريد أن تكون قرارا مدروسا.

لي انها أقرب إلى عدد النحوية المتطلبات في C#:

  • لا تبديل حال دون كسر
  • لا الوصول إلى مستوى "الفروع" (مثل "العامة:" علامة في C++)
  • لا فئة الحقول باستخدام "فار"

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

الكثير من كبيرة ، وشافية هنا — ربما هذا ينطبق أكثر على سؤالك.

وذلك أن من الواضح فورا الذي كود لن تعمل في خدمات الإنترنت دون أذونات مرتفعة، وما إلى ذلك.

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

وأهم الفرق بين كود الآمن وغير الآمن أن التعليمات البرمجية غير آمن لا يمكن الوصول إليه عن طريق جمع القمامة الصافية ل. GC التلقائي هو جزء كبير من العامية من صافي، وعندما تتجاوز حدودها، يمكنك تغيير الكثير من ما يمكن افتراض حول التعليمات البرمجية.

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

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