سؤال

حسنا, أنا أعرف ما كنت أفكر "لماذا أكتب طريقة كنت لا تريد الناس أن استخدام؟" أليس كذلك ؟

حسنا باختصار لدي الدرجة التي تحتاج إلى تسلسل إلى XML.من أجل XmlSerializer أن تفعل سحرها الفئة يجب أن يكون الافتراضي فارغ المنشئ:

public class MyClass
{
  public MyClass()
  {
    // required for xml serialization
  }
}

لذا أريد أن يكون ذلك, ولكن أنا لا أريد الناس أن استخدام ذلك, حتى هل هناك أي السمة التي يمكن استخدامها لوضع علامة على طريقة "لا تستخدم"?

كنت أفكر في استخدام عفا عليها الزمن السمة (لأن هذا يمكن أن وقف بناء) ، ولكن هذا فقط يبدو كيندا "خطأ", هل هناك أي طريقة أخرى للقيام بذلك, أو هل أنا بحاجة الى المضي قدما و لدغة الرصاصة ؟ :)

التحديث

حسنا لقد قبلت كيث الإجابة لأن أعتقد في قلبي من القلوب, وأنا أتفق تماما.هذا هو السبب في أنني سألت السؤال في المقام الأول, أنا لا أحب فكرة وجود عفا عليها الزمن السمة.

ومع ذلك...

هناك هو لا تزال مشكلة ، في حين يتم إعلامك في التحسس ، من الناحية المثالية ، نود أن كسر بناء, هل هناك أي طريقة للقيام بذلك ؟ ربما إنشاء سمة مخصصة?

أكثر تركيزا سؤال تم إنشاء هنا.

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

المحلول

إذا كان الصف [Serialisable] (أيويمكن نسخها في جميع أنحاء المكان حسب الحاجة) param أقل منشئ هناك حاجة إلى deserialise.

أظن أنك تريد فرض التعليمات البرمجية الخاصة بك الوصول إلى تمرير التخلف عن الممتلكات الخاصة بك إلى parameterised منشئ.

أساسا أنت تقول أنه موافق على XmlSerializer نسخ ثم قم بتعيين الخصائص ، ولكن كنت لا تريد الخاص بك التعليمات البرمجية.

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

فقط إضافة XML تعليقات تفاصيل ما تحتاج خصائص initialising (ما).

لا تستخدم [Obsolete], لأنه ليس كذلك.احتياطي ذلك حقا إهمال الطرق.

نصائح أخرى

يمكنك استخدام:

[النظام.ComponentModel.EditorBrowsable(النظام.ComponentModel.EditorBrowsableState.أبدا)]

بحيث لا تظهر في Intellisence.إذا كان المستهلك لا يزال يريد استخدامه ممكن لكنه لن يكون قابلا للاكتشاف.

Keiths نقطة عن أكثر من الهندسة لا يزال قائما على الرغم من.

قرأت العنوان و يعتقد على الفور "عفا عليها الزمن السمة".ماذا عن

    /// <summary>
    /// do not use
    /// </summary>
    /// <param name="item">don't pass it anything -- you shouldn't use it.</param>
    /// <returns>nothing - you shouldn't use it</returns>
    public bool Include(T item) { 
    ....

أنا في الحقيقة يميل أن نختلف مع الجميع هي التي تدعو إلى استخدام ObsoleteAttribute كما وثائق MSDN يقول:

بمناسبة عنصر عفا عليها الزمن بإعلام المستخدمين بأن عنصر سيتم إزالتها في الإصدارات المستقبلية من المنتج.

منذ عام المنشئات على التسلسل XML يجب أن لا تتم إزالة من التطبيق لا تنطبق فقط في حالة صيانة المطور الطريق ليست على دراية كيف XML التسلسل يعمل.

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

يمكنك بناء الخاصة بك Attribute فئة مشتقة ، ويقول NonCallableAttribute للتأهل الطرق ومن ثم إضافة إلى بناء/CI تحليل رمز مهمة الاختيار لرصد إذا كان أي رمز هو استخدام تلك الأساليب.

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

نجاح باهر, هذه المشكلة تزعجني جدا.

تحتاج أيضا الافتراضي منشئات عن NHibernate ، ولكن أريد أن تجبر الناس على عدم استخدام C# 3.0 كائن المهيآت بحيث الطبقات تذهب من خلال منشئ التعليمات البرمجية.

throw new ISaidDoNotUseException();

فصل تسلسل كائن من كائن المجال.

ما تبحث عنه هو ObsoleteAttribute الدرجة:

using System;

public sealed class App {
   static void Main() {      
      // The line below causes the compiler to issue a warning:
      // 'App.SomeDeprecatedMethod()' is obsolete: 'Do not call this method.'
      SomeDeprecatedMethod();
   }

   // The method below is marked with the ObsoleteAttribute. 
   // Any code that attempts to call this method will get a warning.
   [Obsolete("Do not call this method.")]
   private static void SomeDeprecatedMethod() { }
}

ObsoleteAttribute سوف تعمل على الأرجح في الوضع الخاص بك -- يمكنك حتى تسبب بناء لكسر إذا كان هذا الأسلوب.

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

أنا باستخدام ObsoleteAttribute.

ولكن أيضا يمكن أن يكون بعض التعليقات بالطبع.

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

نعم هناك.

كتبت هذا blogpost عن ذلك العمل مع المصمم.

و هنا كود:


public class MyClass
{
  [Obsolete("reason", true)]
  public MyClass()
  {
    // required for xml serialization
  }
}

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