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

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

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

Ответ 1

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

Ответ 2

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

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

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

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

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

Ответ 3

Вы можете заменить 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

С# будет выглядеть так:

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);
}

Здесь следует заметить, что для версии С# на самом деле требовалось меньше набирать текст, потому что VB не мог объединить With с индексом массива и должен был пройти через свойство .Item для определенных вещей. Здесь неважно, но представьте, если в отчете было 20 полей вместо 2 и пришлось сломать 3 предмета вместо 1.

Конечно, вы можете использовать технику, продемонстрированную на С# для VB. Но главное отметить, что With действительно не дает вам многого.

Ответ 4

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

Ответ 5

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

MyObj myObj = ObjFactoryFunction();

...

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

Я чувствую, что этот примерный код чист и краток.

Ответ 6

Обычно, когда я вижу запрос на функцию with на С#, я вижу код, который будет полезен при реорганизации. Обычно, когда рефакторинг выполняется, предполагаемая потребность в 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, но, кажется, естественно вписывается в язык, который у меня уже есть.