سؤال

هذا السؤال لديه بالفعل إجابة هنا:

أنا معتاد على كتابة دروس مثل هذا:

public class foo {
  private string mBar = "bar";
  public string Bar {
    get { return mBar; }
    set { mBar = value; }
  }
  //... other methods, no constructor ...
}

يبدو تحويل Bar إلى خاصية تلقائية أمرًا مريحًا وموجزًا، ولكن كيف يمكنني الاحتفاظ بالتهيئة دون إضافة مُنشئ ووضع التهيئة هناك؟

public class foo2theRevengeOfFoo {
  //private string mBar = "bar";
  public string Bar { get; set; }
  //... other methods, no constructor ...
  //behavior has changed.
}

يمكنك أن ترى أن إضافة المُنشئ لا يتماشى مع توفير الجهد الذي من المفترض أن أحصل عليه من الخصائص التلقائية.

شيء من هذا القبيل سيكون أكثر منطقية بالنسبة لي:

public string Bar { get; set; } = "bar";
هل كانت مفيدة؟

المحلول

التحديث - تمت كتابة الإجابة أدناه قبل ظهور الإصدار C# 6.في C#6 يمكنك كتابة:

public class Foo
{
    public string Bar { get; set; } = "bar";
}

أنت تستطيع أيضًا كتابة الخصائص التي يتم تنفيذها تلقائيًا للقراءة فقط، والتي تكون قابلة للكتابة فقط في المنشئ (ولكن يمكن أيضًا إعطاؤها قيمة أولية افتراضية:

public class Foo
{
    public string Bar { get; }

    public Foo(string bar)
    {
        Bar = bar;
    }
}

ومن المؤسف أنه لا توجد طريقة للقيام بذلك الآن.يجب عليك تعيين القيمة في المنشئ.(استخدام تسلسل المنشئ يمكن أن يساعد في تجنب الازدواجية.)

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

لم يحدث هذا حتى C# 5، ولكن تم التخطيط له لـ C# 6 - سواء من حيث السماح بالتهيئة عند نقطة الإعلان، و السماح بتهيئة الخصائص التي يتم تنفيذها تلقائيًا للقراءة فقط في نص المُنشئ.

نصائح أخرى

يمكنك القيام بذلك عبر مُنشئ صفك:

public class foo {
  public foo(){
    Bar = "bar";
  }
  public string Bar {get;set;}
}

إذا كان لديك مُنشئ آخر (على سبيل المثال، مُنشئ يأخذ معلمات) أو مجموعة من المُنشئين، فيمكنك دائمًا الحصول على هذا (يُسمى تسلسل المُنشئ):

public class foo {
  private foo(){
    Bar = "bar";
    Baz = "baz";
  }
  public foo(int something) : this(){
    //do specialized initialization here
    Baz = string.Format("{0}Baz", something);
  }
  public string Bar {get; set;}
  public string Baz {get; set;}
}

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

سيكون من الممكن في C# 6.0:

public int Y { get; } = 2;

في المُنشئ الافتراضي (وأي مُنشئ غير افتراضي إذا كان لديك أيضًا بالطبع):

public foo() {
    Bar = "bar";
}

أعتقد أن هذا لا يقل أداءً عن الكود الأصلي الخاص بك، لأن هذا هو ما يحدث خلف الكواليس على أي حال.

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