سؤال

اعتدت التفكير مرات عديدة قبل على الطرق العامة ، ولكن لم أكن أدرك أن طرق خاصة يمكن الاحتجاج بها أيضا.انظر التأمل مع القطاع الخاص أعضاء.

لماذا هذا مسموح به في المقام الأول ؟ ألن كسر القاعدة "خاص" "خاصة"?

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

المحلول

private في C# هو حقا فقط جزءا من اللغة المواصفات ؛ في لغة C#, وكذلك في Visual Basic أو أي لغة أخرى معقولة .صافي لغة (بما في ذلك CIL, ما كل .NET languages ترجمة إلى) واحد هو منع من الوصول إلى private (أو protected, إذا أنت لست ضمن فئة مشتقة) عضو في اللغة.ومع ذلك, فقط لأن اللغة لا تدعم علنا الوصول إلى private أو protected أعضاء لا يعني الإطار الأساسي لا يمكن أن توفر الوصول إلى تلك الأعضاء.

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

نصائح أخرى

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

والإطار هو تماما قادرة على تقييد الوصول بشكل مناسب - فقط لا تفعل ذلك عندما كنت تعمل تحت الثقة الكاملة أو عندما يكون لديك أذونات محددة. انظر "اعتبارات الأمن للتأمل" للحصول على مزيد من التفاصيل من عند " إعادة قادرة على القيام بذلك.

وصحيح، فإنه كسر القاعدة. والا ما كنت تقريبا تمرير قانون خلال الاستعراض إذا لم شخص هذا.

وعن طريق انعكاس لاستدعاء أسلوب غير slllloooow، لم تكتب آمنة، وفواصل بسهولة إذا كانت الطبقة الأساسية لديها أساليب خاصة أعيدت صياغتها.

وهكذا وباختصار، أنا أوافق، انها فكرة سيئة!

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

هناك بعض الأماكن التي يمكن أن تكون مفيدة:

  • رمز تراث الاختبار - على سبيل المثال ، افترض أنك تعمل مع رمز تراث و تريد تغطية ذلك مع وحدة الاختبارات.إذا كنت لا يسمح بتغيير رمز كنت ترغب في اختبار جزء صغير من وظائف الاحتجاج طرق خاصة هو مفيد.
  • الخارقة في إنتاج البرمجية - واجهت مرة واحدة الخلل في 3rd الطرف التحكم فيها في بعض سيناريو خاص تنظيف لم يحدث.استخدام الخاص الاحتجاج يمكنني العمل حوله.

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

انعكاس قوي على وظائف .صافي ولكن أيضا لها سلبيات.

الايجابيات:

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

  2. في بعض الحالات النادرة, التفكير هو السبيل الوحيد لتنفيذ المهمة.

سلبيات:

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

  2. انعكاس أبطأ بكثير وتستهلك موارد أكثر من ساكنة الرجوع (بالطريقة العادية هل أساليب الدعوة).لهذا السبب يجب تجنب انعكاس إلا إذا كان هذا هو السبيل الوحيد لحل المشكلة.

أمثلة عند التفكير هو السبيل الوحيد لحل المشكلة اتبع:

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

  2. تريد استنساخ كائن.كنت بحاجة إلى استخدام التفكير للوصول إلى حقول خاصة.

آمل أن يساعد هذا.أود أن أشكر السيد هنافرانشيسكو Balena له الكتاب الجميل, البرمجة Microsoft Visual Basic 2005:اللغة.

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