لماذا لم يتم تضمين بنية with() في C#، في حين أنها رائعة حقًا في VB.NET؟

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

  •  07-07-2019
  •  | 
  •  

سؤال

أنا مطور C#.أنا حقًا أحب الدعامة المتعرجة لأنني أتيت من خلفية C وC++ وJava.ومع ذلك، فأنا أيضًا أحب لغات البرمجة الأخرى ضمن عائلة .NET مثل VB.NET.إن التبديل ذهابًا وإيابًا بين C# وVB.NET ليس في الواقع أمرًا كبيرًا إذا كنت تقوم بالبرمجة لفترة من الوقت في .NET.وهذا أسلوب شائع جدًا في الشركة التي أعمل بها.كرجل C#، أنا حقًا أحب XML الحرفي و with الكلمات الأساسية التي يوفرها مترجم VB.NET.أتمنى أن تقوم Microsoft بتضمين هذه الميزات في C# أيضًا.

أنا فقط أشعر بالفضول لمعرفة ما يقوله المطور الآخر حول هذا الموضوع!

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

المحلول

وأنا لن أفاجأ إذا "مع" أو يتم إضافة ميزة مشابهة لC # في نهاية المطاف جنبا إلى جنب مع ميزات حتى الآن شعبية VB حصريا أخرى. كان هناك الكثير من الحديث في العروض معاينة C # 4.0 مؤخرا في PDC وغيرها من "التركيز على المساواة بين اللغات" زيادة بدءا C # 4.0 و VB 10.

نصائح أخرى

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

ومع ذلك، فإنه يكون من المفيد أن تكون قادرًا على تهيئة كائن بشكل مضغوط مع العديد من الخصائص - وهذا هو بالضبط السبب الذي يجعل C# 3 يسمح لك بالكتابة:

MyObject x = new MyObject { Name="Fred", Age=20, Salary=15000 };

هناك قيود على ذلك (والتي ستساعد المعلمات الاختيارية والمسماة في C# 4 في التغلب عليها) ولكنها أفضل مما كانت عليه دون أن تؤدي إلى فوضى/غموض محتمل.

(على الجانب الحرفي لـ XML، أنا مرة أخرى مع فريق C# - XML ​​عبارة عن تقنية محددة جدًا يمكن وضعها في لغة ما.إذا كان بإمكانهم التوصل إلى أ المعممة الذي حدث لإنشاء XML ولكن يمكن استخدامه لإنشاء أشجار أخرى أيضًا، سيكون ذلك أمرًا رائعًا - تمامًا كما لا ترتبط تعبيرات الاستعلام بشكل مباشر بـ IEnumerable أو IQueryable.)

ويمكنك استبدال With VB.Net من خلال خلق حرف واحد فقط اسم متغير سريع. انها في الواقع أقل الرمز، منذ With يتطلب أيضا End With في وقت لاحق.

وعلى سبيل المثال، شيء واحد اعتدت على القيام به في كثير من الأحيان إلى حد ما وتكرار عبر الصفوف في DataTable ولتقرير أسلوب السيطرة / استراحة.

في vb.net، التي قد تبدو مثل هذا:

Dim CurCustomerName As String 
Dim CustomerSalesTotal As Decimal

Dim ds As DataSet = GetReportData()
With ds.Tables(0).Rows
   Dim i As Integer = 0
   While i < .Count
       ''//{
       CurCustomerName = .Item(i)("CustName")
       CustomerSalesTotal = 0
       PrintHeaderLine(CurCustomerName)

       While i < .Count AndAlso CurCustomerName = .Item(i)("CustName")
            ''//{
            PrintItemLine(.Item(i)("OrderTotal"))
            CustomerSalesTotal += .Item(i)("OrderTotal")

            i+= 1
       End While ''//}
       PrintSubTotalLine(CustomerSalesTotal)
   End While ''//}
End With

وقال إن C # تبدو هذه:

string CurCustomerName;
Decimal CustomerSalesTotal;

DataSet ds = GetReportData();
DataRowCollection r = ds.Tables[0].Rows;
int i=0;
while (i<r.Count)
{
    CurCustomerName = r[i]["CustName"];
    CustomerSalesTotal = 0;
    PrintHeaderLine(CurCustomerName);

    while (i<r.Count && CurCustomerName == r[i]["CustName"])
    {
        PrintItemLine(r[i]["OrderTotal"]);
        CustomerSalesTotal += r[i]["OrderTotal"];

        i++;
    }
    PrintSubTotalLine(CustomerSalesTotal);
}

ما يجب ملاحظته هنا هو أن C # نسخة حاجة في الواقع أقل الكتابة، لأن VB لا يمكن الجمع بين WITH مع مؤشر مجموعة، وكان عليه أن يذهب من خلال الخاصية .Item لأشياء معينة. انها ليست صفقة كبيرة هنا، ولكن تخيل إذا كان التقرير 20 الحقول بدلا من 2 وكان لكسر في 3 وحدات بدلا من 1.

وبطبيعة الحال، يمكن استخدام هذه التقنية أثبتت في C # لVB كذلك. ولكن الشيء الرئيسي هو أن نلاحظ أن WITH لا تعطي حقا لك الكثير.

وانه عن تفضيلات المطور، ولكن أنا معك حول مع. أفضله هو تقليل عدد المتغيرات في اللعب، ونطاق الذي يعيشون فيه. يبدو أن فلسفة C # أن يكون الشيء نفسه. ولكن في هذه الحالة يبدو أن ردود هنا تشير إلى أن إضافة (وجعل نفسك مسؤولا عن) متغير هو شيء جيد بالمقارنة مع بناء الذي، بالنسبة لي، هي مشابهة جدا لlambdas.

وأشعر أنه هو إجراء تعسفي وليس للسماح فقط "كتلة" إعداد الخاصية أثناء التهيئة. في الحقيقة أنا لا أحصل على ماذا هذا من شأنه أن يكون "سيئا":

MyObj myObj = ObjFactoryFunction();

...

if(someCondition)
  myObj { Prop1 = 1, Prop2 = 2 };

وأنا أشعر أن هذا المثال رمز نظيفة وموجزة.

وعادة عندما أرى طلب للحصول على ميزة with في C #، وأرى التعليمات البرمجية التي يمكن أن تستفيد من إعادة بيع ديون. عادة عندما يتم إعادة بيع ديون، وذهب الحاجة المفترض لwith.

وأنا أحب الطريقة قانون بلدي يعمل بها عندما كنت بناء واجهة بطلاقة في لكائن. لديها بعض أوجه التشابه مع with. إذا كنت تصميم MessageBox.Show()، وأنا قد تكتب:

new MessageBox()
    .SetText("Hello World!")
    .SetButtons(MessageBox.Buttons.OK)
    .SetIcon(MessageBox.Icon.Information)
    .Show();

ويمكنك أيضا أن ترى شيئا من هذا القبيل مع ينق:

var q = Enumerable.Range(1, 100)
            .Where(x => x % 2 == 0)
            .Select(x => x * x);

وتشعر أنها أشبه with ولكن يبدو لتناسب بشكل طبيعي في للغة لدي بالفعل.

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