سؤال

ما هي القيمة هل تعتقد اسمه وسوف المعلمات الافتراضية إضافة في C # .NET 4.0؟

وماذا سيكون الاستخدام الجيد لهذه (وهذا لم يتحقق بالفعل مع الحمولة الزائدة والغلابة)؟

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

المحلول

ويمكن أن يجعل الصانعين بساطة، وخاصة بالنسبة للأنواع غير قابل للتغيير (التي تعتبر هامة لخيوط) - <وأ href = "http://marcgravell.blogspot.com/2008/11/immutability-and-optional-parameters.html" يختلط = "نوفولو noreferrer"> انظر هنا لمناقشة الكاملة . ليس لطيفا كما <م> يجب يكون ربما، ولكن أجمل من وجود الكثير من الزائدة. من الواضح أنك لا يمكنك استخدام المهيآت الكائن مع كائنات ثابتة، وبالتالي فإن المعتاد:

new Foo {Id = 25, Name = "Fred"}

وليس المتاحة؛ سوف تسوية ل:

new Foo (Id: 25, Name: "Fred")

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

والجانب COM من الأشياء هو المهم أيضا أن الكثير من الناس، لكنني ببساطة لا تستخدم الكثير من إمكانية التشغيل المتداخل COM - وهذا ليس <م> ك مهم بالنسبة لي


وتعليقات تحرير إعادة. لماذا لا مجرد استخدام نفس الجملة التي سمات استخدام؟ بسيطة - أنها يمكن أن تكون غامضة مع الأعضاء الآخرين / المتغيرات (وهي ليست مشكلة مع سمات)؛ نأخذ مثال:

[XmlElement("foo", Namespace = "bar")]

والذي يستخدم معلمة واحدة العادية (إلى المنشئ، "فو")، واسمه مهمة واحدة. لذلك نفترض أننا استخدمنا هذا لالوسائط المسماة العادية:

SomeMethod("foo", SecondArg = "bar");

(والذي يمكن أيضا أن يكون منشئ، لقد استعملت طريقة لالبساطة)

والآن ... ماذا لو كان لدينا متغير أو خاصية تسمى SecondArg؟ وهذا سيكون غامضا بين استخدام SecondArg كحجة اسمه إلى SomeMethod، و<م> تعيين "شريط" لSecondArg، ويمر "شريط" كحجة العادية .

لتوضيح ذلك، هذا هو قانوني في C # 3.0:

    static void SomeMethod(string x, string y) { }
    static void Main()
    {
        string SecondArg;
        SomeMethod("foo", SecondArg = "bar");
    }

والواضح، يمكن أن يكون SecondArg الممتلكات، الحقل، varialble، الخ ...

وليس لديها بناء الجملة بديل هذا الغموض.


تحرير - هذا القسم من قبل 280Z28: آسف لإضافة هذا هنا، ولكنها ليست حقا إجابة فريدة من نوعها وانها طويلة جدا بالنسبة للتعليقات، وتشمل التعليمات البرمجية. كنت ألمح في الغموض ولكن لم المثال الخاص بك لا تسلط الضوء على حالة اتخاذ قرار. أعتقد أن المثال الذي أعطيته يشير إلى شيء يمكن أن يكون مربكا، ولكن {} المطلوبة حول المهيآت الكائن يمنع الغموض بنائي الأساسي. وجزءا لا يتجزأ من تعليلي لرمز التالية باعتبارها كتلة متعدد الخطوط تعليق.

[AttributeUsage(AttributeTargets.Class)]
public sealed class SomeAttribute : Attribute
{
    public SomeAttribute() { }

    public SomeAttribute(int SomeVariable)
    {
        this.SomeVariable = SomeVariable;
    }

    public int SomeVariable
    {
        get;
        set;
    }
}

/* Here's the true ambiguity: When you add an attribute, and only in this case
 * there would be no way without a new syntax to use named arguments with attributes.
 * This is a particular problem because attributes are a prime candidate for
 * constructor simplification for immutable data types.
 */

// This calls the constructor with 1 arg
[Some(SomeVariable: 3)]
// This calls the constructor with 0 args, followed by setting a property
[Some(SomeVariable = 3)]
public class SomeClass
{
}

نصائح أخرى

ووسوف تساعد على تفادي مشكلة توفير API لائق للعمل مع تطبيقات Office! :)

وبعض أجزاء من API مكتب على ما يرام، ولكن هناك حالات الحافة التي تم تصميمها بوضوح للاستخدام من لغة مع اختياري المعلمات / اسمه. ولهذا السبب C # لا بد أن يكون لهم.

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

والنظر في الطبقة استثناء. بدلا من منشئ واحد مع الوسائط الاختيارية، فقد أربعة الصانعين لكل مجموعة من 'له رسالة "، و" لديها الاستثناء الداخلي'. هذا على ما يرام، ولكن النظر الآن ماذا يحدث إذا قمت بتوفير قيمة فارغة إلى منشئ أخذ innerException؟ هل تتصرف تماما مثل منشئ مع مع عدم وجود المعلمة innerException، sortof مثل منشئ مع عدم وجود المعلمة innerException، أو أنها لا رمي استثناء مرجع فارغة؟

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

وأيضا لا ننسى أن لديها الآن كل فئة استثناء مستمدة أيضا لتشمل 4 الصانعين، وهو مشاحنات لا طائل منه.

ووستجعل COM إمكانية التشغيل المتداخل أسهل كثيرا.

وحتى كان C # 4 VB.Net لغة أفضل بكثير عن إمكانية التشغيل المتداخل. دون افتراضات لديك قوائم ضخمة من المعلمات المرجع وهمية في C #.

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

وهذا أيضا لا يتم ترجمة:

[AttributeUsage(AttributeTargets.Property, Inherited = false, AllowMultiple = true)]
sealed class MyAttribute : Attribute
{
    public MyAttribute(object a = null)
    {

    }
}


class Test
{
    [My] // [My(a: "asd")]
    int prop1 { get; set; }
}

وحين يفعل هذا:

[AttributeUsage(AttributeTargets.Property, Inherited = false, AllowMultiple = true)]
sealed class MyAttribute : Attribute
{
    public MyAttribute()
    {

    }

    public object a { get; set; }
}

class Test
{
    [My] // [My(a=null)]
    int prop1 { get; set; }
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top