Почему конструкция 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
, но, кажется, естественно вписывается в язык, который у меня уже есть.