c# - شرح - سي شارب pdf




هل تمتلك C#خصائص امتداد؟ (4)

في الوقت الحاضر لا يزال غير معتمد خارج منطقة الجزاء من قبل المجمع Roslyn ...

حتى الآن ، لم يتم النظر إلى خصائص الامتداد على أنها ذات قيمة كافية لإدراجها في الإصدارات السابقة من معيار C # (أي 5 و 6).

لكنه سيبقى ...

يوجد عنصر أعضاء ملحق في قائمة عمل C # 7 بحيث يمكن دعمه في المستقبل القريب. يمكن العثور على الحالة الحالية لخاصية الامتداد على Github تحت البند ذي الصلة .

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

وعلاوة على ذلك يمكنك استخدام حل بديل

كما هو TypeDescriptor في هذه article ، يمكنك استخدام إمكانية TypeDescriptor لإرفاق سمة إلى مثيل كائن في وقت التشغيل. ومع ذلك ، فإنه لا يستخدم بناء الجملة من الخصائص القياسية.
انها تختلف قليلا عن السكر النحوي فقط إضافة إمكانية لتحديد خاصية ممتدة مثل
string Data(this MyClass instance) كاسم مستعار لطريقة التمديد
string GetData(this MyClass instance) لأنه يخزن البيانات في الفصل.

آمل أن C # 7 سيوفر امتدادا ممتعا لكل شيء (الخصائص والحقول) ، ولكن في هذه النقطة ، فإن الوقت فقط سيخبرنا.

ولا تتردد في المساهمة حيث ستأتي برامج الغد من المجتمع.

التحديث: أغسطس 2016

كما نشر فريق dotnet ما هو الجديد في C # 7.0 ومن تعليق على Mads Torgensen :

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

يبدو أن خصائص الامتداد والأعضاء الآخرين ، لا يزالون مرشحين جيدين ليتم تضمينهم في إصدار لاحق لـ Roslyn ، ولكن ربما لا يكون الإصدار 7.0.

تحديث: أيار 2017

تم إغلاق أعضاء الإضافة على أنها نسخة مكررة من كل ما يتعلق بالإضافة التي تم إغلاقها أيضًا. كان النقاش الرئيسي في الواقع حول قابلية التوسع نوع بمعنا واسع. يتم الآن تتبع الميزة هنا كمقترح وتمت إزالتها من 7.0 معلم .

تحديث: أغسطس ، 2017 - C # 8.0 الميزة المقترحة

في حين أنه لا يزال فقط ميزة مقترحة ، لدينا الآن رؤية أوضح لما سيكون تركيبه. ضع في اعتبارك أن هذا سيكون الصيغة الجديدة لطرق الإضافات أيضًا:

public interface IEmployee 
{
    public decimal Salary { get; set; }
}

public class Employee
{
    public decimal Salary { get; set; }
}

public extension MyPersonExtension extends Person : IEmployee
{
    private static readonly ConditionalWeakTable<Person, Employee> _employees = 
        new ConditionalWeakTable<Person, Employee>();


    public decimal Salary
    {
        get 
        {
            // `this` is the instance of Person
            return _employees.GetOrCreate(this).Salary; 
        }
        set 
        {
            Employee employee = null;
            if (!_employees.TryGetValue(this, out employee)
            {
                employee = _employees.GetOrCreate(this);
            }
            employee.Salary = value;
        }
    }
}

IEmployee person = new Person();
var salary = person.Salary;

مشابه للدروس الجزئية ، ولكن يتم تجميعها كفصل / نوع منفصل في مجموعة مختلفة. لاحظ أنه سيكون بإمكانك أيضًا إضافة أعضاء ومشغلين ثابتين بهذه الطريقة. كما هو مذكور في بودكاست مادس تورجينسين ، لن يكون للامتداد أي حالة (لذلك لا يمكن إضافة أعضاء نسخة خاصة إلى الفصل) مما يعني أنك لن تكون قادرًا على إضافة بيانات مثيل خاصة مرتبطة بالمثيل . والسبب في ذلك هو أنه يعني إدارة القواميس الداخلية وقد يكون من الصعب (إدارة الذاكرة ، الخ ...). لهذا ، لا يزال بإمكانك استخدام تقنية TypeDescriptor / ConditionalWeakTable الموضحة مسبقًا ومع إضافة الخاصية ، يتم TypeDescriptor تحت خاصية لطيفة.

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

هل تمتلك C # خصائص امتداد؟

على سبيل المثال ، يمكن إضافة خاصية ملحق إلى DateTimeFormatInfo تسمى ShortDateLongTimeFormat والتي قد ترجع ShortDatePattern + " " + LongTimePattern ؟


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

حسنا ، أخيرا يمكننا جميعا نفرح! ستقوم Microsoft بتقديم هذا في الإصدار القادم من C # 8.

لذلك بدلا من القيام بذلك ...

public static class IntExtensions
{
   public static bool Even(this int value)
   {
        return value % 2 == 0;
   }
}

سنكون في النهاية قادرين على فعل ذلك مثل ...

public extension IntExtension extends int
{
    public bool Even => this % 2 == 0;
}

المصدر: https://blog.ndepend.com/c-8-0-features-glimpse-future/


لا ، هم غير موجودين.

أعلم أن فريق C # كان يفكر فيها في مرحلة ما (أو على الأقل كان Eric Lippert) - إلى جانب مهندسي التمديدات والمشغلين (قد يستغرق ذلك بعض الوقت للحصول على رأسك ، ولكن الجو بارد ...) ومع ذلك ، أنا ملاذ لم يشاهد أي دليل على أنهم سيكونون جزءًا من C # 4.

EDIT: لم تظهر في C # 5 ، واعتبارًا من يوليو 2014 لا يبدو أنها ستكون في C # 6 أيضًا.

قام إريك ليبرت ، المطور الرئيسي في فريق مترجم سي # في مايكروسوفت حتى نوفمبر 2012 ، بالتدوين حول هذا الموضوع في أكتوبر 2009:


لا توجد في C # 3.0 ولن تتم إضافتها في 4.0. توجد في قائمة الميزات المطلوبة لـ C # ، لذا يمكن إضافتها في تاريخ مستقبلي.

في هذه المرحلة ، أفضل ما يمكنك القيام به هو أساليب تمديد أسلوب GetXXX.







extension-methods