Почему конструкция with () не включена в C #, когда это действительно здорово в VB.NET? - PullRequest
10 голосов
/ 10 января 2009

Я разработчик C #. Я действительно люблю фигурные скобки, потому что я пришел из C, C ++ и Java фона. Однако мне также нравятся другие языки программирования семейства .NET, такие как VB.NET. Переключение между C # и VB.NET не так уж и сложно, если вы некоторое время программировали в .NET. Это очень распространенный подход в компании, где я работаю. Как C # парень, мне действительно нравятся XML-литерал и with ключевые слова, предоставляемые компилятором VB.NET. Я бы хотел, чтобы Microsoft включила эти функции и в C #.

Мне просто любопытно, что другой разработчик может сказать об этом!

Ответы [ 6 ]

16 голосов
/ 10 января 2009

Лично мне не нравится WITH, когда он используется после построения - если вам нужно сделать несколько вещей с объектом после его инициализации, обычно такое поведение должно быть инкапсулировано в самом типе. Если вы действительно хотите сделать что-то вроде WITH, это всего лишь вопрос объявления короткой переменной и, возможно, введения новой области видимости.

Однако полезно , чтобы иметь возможность компактно инициализировать объект с несколькими свойствами - именно поэтому C # 3 позволяет писать:

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

Для этого есть ограничения (которые помогут преодолеть необязательные и именованные параметры в C # 4), но это лучше, чем было, не приводя к потенциальной путанице / неясностям.

(Что касается литералов XML, я снова в команде C # - XML ​​- это очень специфическая технология для внедрения в язык. Если бы они могли придумать обобщенную форму, которая могла бы создать XML, но может быть использован и для создания других деревьев, что было бы неплохо - точно так же, как выражения запросов напрямую не связаны с IEnumerable или IQueryable.)

3 голосов
/ 10 января 2009

Вы можете заменить VB.Net With, создав быстрое однобуквенное имя переменной. Это на самом деле меньше кода, так как With также требует End With позже.

Например, одна вещь, которую мне приходилось делать довольно часто, - это итерация по строкам в таблице данных для отчета стиля управления / прерывания.

В 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 на самом деле мало что дает.

1 голос
/ 12 января 2009

Обычно, когда я вижу запрос на with функцию в C #, я вижу код, который выиграет от рефакторинга. Обычно, когда рефакторинг выполняется, предполагаемая потребность в with исчезает.

Мне нравится, как работает мой код, когда я встраиваю свободный интерфейс в объект; оно имеет некоторые сходства с with. Если бы я проектировал MessageBox.Show(), я мог бы написать:

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

Вы также можете увидеть что-то похожее с Linq:

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

Это похоже на with, но, кажется, естественно вписывается в язык, который у меня уже есть.

1 голос
/ 10 января 2009

Я чувствую, что довольно произвольно разрешать установку «массовых» свойств во время инициализации. Я действительно не понимаю, почему это было бы «плохо»:

MyObj myObj = ObjFactoryFunction();

...

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

Мне кажется, что этот пример кода чистый и лаконичный.

1 голос
/ 10 января 2009

Речь идет о предпочтениях разработчика, но я с вами о WITH. Я предпочитаю минимизировать количество переменных в игре и область, в которой они живут. Философия C # кажется почти такой же. Но в этом случае ответы здесь, по-видимому, предполагают, что добавление (и принятие на себя ответственности) переменной - это хорошо, по сравнению с конструкцией, которая, на мой взгляд, очень похожа на лямбду.

0 голосов
/ 12 января 2009

Я не удивлюсь, если "C" или подобная функция будет добавлена ​​в C # в конце концов вместе с другими популярными до сих пор функциями VB. В предварительных презентациях C # 4.0 в PDC и других местах было много разговоров о повышенном «фокусе на языковой паритет», начиная с C # 4.0 и VB 10.

...