понедельник, 2 апреля 2012 г.

С# - первое знакомство

С недавних пор начал искать более шустрые альтернативы платформе VB.NET. (Согласен, с одной стороны при прямых руках все будет работать быстро на любой платформе, но в данный момент мне нужно было найти быстрое решение для поставленных мною задач). Итак, начальный выбор мой пал на C#, как на наиболее благоприятную платформу с точки зрения перехода с VB.NET. Первоначальное впечатление - достаточно благоприятное, но обо всем по порядку:

Различия в синтаксисе порадовали тем, что они относительно небольшие:

Определение переменных:
VB.NET:
Dim A as String="Hello, World!"
С#:
string a="Hello, World!";

Операторы сравнения:
VB.NET:
If A<>"" Then
    MessageBox.Show("Hello, World!")
EndIf
C#:
if(A!=""){
    MessageBox.Show("Hello, World!");
}
И все бы ничего, пока не начались казусы, которые в VB.NET показались бы гм... непонятными с точки зрения причины возникновения ошибки:

VB.NET:
Dim val as String="Ячейка таблицы: "+Me.DataGridView1.SelectedRows(0).Cells("Customer").Value.ToString()
C#:
String val="Ячейка таблицы: "+this.DataGridView1.SelectedRows[0].Cells['Customer'].Value.ToString();

Вроде бы все одинаково, однако в C# возникает ошибка: "Невозможно преобразовать группу методов ToString" в тип, не являющийся делегатом string. Предполагается ли вызвать объект?"

Что самое потрясающее - это вопрос в... всплывающей подсказке!
В итоге, погуглив немного, решение нашлось:
С#:
String val="Ячейка таблицы: "+Convert.ToString(this.DataGridView1.SelectedRows[0].Cells['Customer'].Value);
Но, согласитесь, как минимум, странно. Но что меня добило, это то, что для очистки неиспользуемых ссылок (которая в VB.NET запускается одной кнопкой) в C# предлагается внешняя программа за $350! В общем, благоприятные впечатления от C# постепенно начали рассеиваться. И далее по нарастающей:

Для создания эвента в VB.NET в коде формы создается конструкция типа:

VB.NET:
Private Sub starter() Handles MyBase.Load
    ...
End Sub

Для C# нужно не только написать обработчик эвента в коде формы:

С#:
void  Form1_Load (Object sender, EventArgs e){
    ...
}

 но и прописать его в коде From Designer'а:

C#:
this.Load += new System.EventHandler(this.Form1_Load);

А как быть к примеру для назначения эвентов для двойного клика внутри строки DataGrid?. И если таких эвентов не один и не два? В конечном итоге: C# - это безусловно решение для профессионалов, однако есть ряд моментов, которые вызывают в лучшем случае изумленную улыбку непонимания. У C# есть безусловный плюс в том, что его можно применять не только в среде WinForms, но и в веб- и WPF-приложениях, но те же возможности есть и у VB.NET. Однако проблем при написании - много больше. Вывод прост - пока остаюсь на VB.NET.