لا حاجة إلى التقدير يدويا تتضمن التعدادات FlagsAttribute دوت؟

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

سؤال

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

[Flags]
private enum NewsStyle
{
    Thumbnail = 0,
    Date = 1,
    Text = 2,
    Link = 4,
    All = 8
}

string FormatNews( DataRow news, NewsStyle style )
{
    StringBuilder HTML = new StringBuilder();

    // Should the link be shown
    if ( ((newsStyle & NewsStyle.All) == NewsStyle.All || (newsStyle & NewsStyle.Link) == NewsStyle.Link))
    {
                HTML.AppendFormat("<a style=\"text-decoration:none; color: rgb(66, 110, 171);\" href=\"ViewStory.aspx?nsid={0}\">",
                                  UrlEncode(newsStory["NewsStoryID"].ToString()));
    }

    // Etc etc...
}

// So to call the method...
Response.Write( FormatNews( news, NewsStyle.Date | NewsStyle.Text ) );

والمشكلة هي أنني لا يمكن إلا أن الحصول على رمز للعمل إذا أنا يدويا تحديد القيم على التعداد، وإلا لا يعمل عملية أحادي المعامل التعداد التحقق بشكل صحيح.

ولقد تابعت دائما حكم السماح صافي التعامل مع تكليف القيم تتضمن التعدادات - هل هذا الاستثناء geniuine

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

المحلول

نعم، هو استثناء حقيقي. التعدادات هي من القيم الافتراضية المعينة من 0 فصاعدا، كل واحد 1 أعلى من القيمة السابقة، بغض النظر عن أي FlagsAttributes. (هناك بالطبع قواعد أكثر تفصيلا لعند تحديد بعض القيم يدويا - راجع في مستندات MSDN )

ولئن كان ل<م> إلى حد ما معنى أن يكون تعداد أعلام تلقائيا على القيم في صلاحيات اثنين، وأرى الأسباب التي ربما من الأفضل عدم قيام بذلك:

ومن المعقول تماما أن يكون هناك تعداد مثل هذا:

[Flags]
enum Foo
{
    None,
    Bar,
    Baz, 
    BarAndBaz
} 

وهذا بالطبع يتطلب القيم لتكون 0، 1، 2 و 3 لتكون معقولة.

وانها تريد ان تكون جميلة غير بديهية للسماح بحضور مجرد سمة تغير معنى كامل لقطعة من C # رمز. نظر لي Foo سبيل المثال التعداد. يجب إزالة السمة Flags أن يسمح لكسر الشفرة عن طريق تغيير بصمت قيم العداد؟

نصائح أخرى

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

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