Жанр: Учеба
Си шарп: создание приложений для windows
...объекта
DataView применялась инструкция:
ds.Tables["Customers"].DefaultView;
то есть получали у объекта ds (DataSet) таблицу Customers как объект
типа DataTable. Мы имеем право использовать название таблицы как
индексатор, поскольку определили это при заполнении ds.
DataAdap^er.Fill(ds, "Customers");
Объект DataTable имеет свойство DefaultView, которое и применяется
программой как источник данных для DataGrid.
Работа с приложением
Откомпилируйте и запустите
программу. Вы получите
окно, изображенное на рис.
33.10.
Обратите внимание, что программа
заполнила заголовок
таблицы названиями полей
базы данных. Это делается
автоматически. Кроме того,
представленный список может
сортироваться. Для проверки
сортировки щелкните
левой кнопкой мыши по одному
из заголовков списка.
Например, если вы используете
для сортировки поле СотpanyName,
то записи таблицы
будут рассортированы в
соответствии с алфавитным
принципом сравнения строк
(а, Ь, с...). Окно с отсортированным
списком представлено
на рис. 33.11.
мпшпга More .ятопю More Uwnet : IS| MS-JSA! |null|
^roundtheH ThornasHard SajesReptes [171] 55577 (171)555
Berglundssn _ ChrotmaSer Order Admini .0921-12 34 8 0921-12:
_8lauerSeeD HannaMoos SalesRepies .0621-03460 0621-089
Blonde:ddsl Frederique D -MaiketingMa :B8G015.31 88.60.15
Eolid^Crmd Met" senm Oi rei [91)C5C-2S [91]5t c
Bonapp1 LauienceLeb Owner 91.24 AS.40 :31.24.45
Bottom DcBa Ei'abfthLin ^courtngM (604]5r5 47 [b041 C5C
Рис. 33.10. Окно программы, использующей DataGrid
AntnnmMoie Antonio More Dwnei (5] 555-3932 (null)
AioundlheH .Thomas Had .Sales Represents [171)55577 (171) 555-67
Berglundssn Christina Вei • Ordei AdrmiKstrol 0Э21 -12 34 Б 0921 -12 34 ?
Blauer See D Hanna Moos Sales Fiepiesenta 0021 -08460 0621-08324
BloridKsddsl Fiedetique Ci Marveling Manag 8S60 15 31 89 60.15 32
EulidoComd Martin Somm Ownei [91)555228 |Э1]55591 Э
Bonapp1 Laurpnr-e L^b Q'mPi 91244140 91244541
В tl irDjllai Elujbi-tt Lin Vroutn^Mati (604) 555 4 7 (ЬП4)С5= V
Рис. 33.11. Окно с отсортированным списком данных
Детальная настройка DataSet
Код, который мы выбрали для создания приложения в предыдущем
разделе, был максимально оптимизирован и не давал полного представления
о свойствах и методах используемых элементов. Однако существует
возможность написания более понятного кода с детальной настройкой
всех используемых элементов.
Для создания объекта DataAdapter использовался конструктор типа:
SqlDataAdapter DataAdapter =
new SqiDataAdapter(commandString, connectionString);
Данный конструктор самостоятельно создает и инициализирует объекты
SelectCommand и SqlConnection. Для создания управляемого кода программы
лучше применять отдельное создание свойств объекта с последующим
присвоением их объекту назначения.
private System. Data. SqlClient. SqlConnection rr.yConnection;
private System.Data.DataSet myDataSet;
private System.Data.SqlClient.SqlCommand myCommand;
private System.Data.SqlClient.SqlDataAdapter DataAdapter;
Объявляем строку для подключения к базе.
strinq connectionString = "server-(local)WNetSDK;" +
"Trustedonnection^yes; database-northwind";
Создаем объект SqlConnection и инициализируем его строкой для подключения
к базе.
rr.yConnection = new SqlConnection () ;
myConnection.ConnectionString = connectionString;
Затем явно открываем соединение с базой.
myConnection.Open ();
Явное открытие соединения с базой позволяет сократить время доступа
к данным за счет использования одного и того же соединения в пределах
одной сессии (одного сеанса работы с базой). Если вам необходимо
подключиться к базе с иными правами доступа или другими опциями,
тогда закройте соединение, инициализируйте заново строку для подключения
и откройте соединение заново. ВСЕГДА ЗАКРЫВАЙТЕ СОЕДИНЕНИЕ!
Особенно это касается создания серверных приложений. При уничтожении
объекта SqlConnection соединение закрывается автоматически.
Поэтому если ваша программа всегда будет работать с базой в пределах
одной сессии, вы можете сделать исключение и не закрывать соединение.
Однако это плохое правило. Я позволю себе опустить код закрытия
соединения с базой, чтобы не перегружать программу лишними строками
кода.
Затем создаем объект DataSet.
myDataSet ^ new DataSet ( | ;
Создаем объект SqlCommand и настраиваем его строкой выбора данных
и объектом SqlConnection для подключения к базе. Строка выбора
данных немного изменилась. Теперь мы получаем все поля таблицы
Customers.
Работа с базами данных 349
myCommand = new SqlCommand();
myCommand.Connection = myConnection;
myCommand.CommandText = "Select * From Customers";
Создание объекта DataAdapter тоже отличается от предыдущего примера.
Мы явно указываем для этого объекта командную строку, явно настраиваем
имена таблиц и явно заполняем DataSet.
DataAdapter = new SqlDataAdapter();
DataAdapter.SelectCommand = myCommand;
DataAdapter.TableMappings.Add("Table", "Customers");
DataAdapter.Fill(myDataSet);
Настройка элемента DataGrid не отличается от предыдущего примера.
customerDG.DataSource -
myDataSet.Tables["Customers"].DefaultView;
Вот полный листинг программы с явной детальной настройкой компонент
работы с базой данных.
using System;
using System.Drawing;
using System,Collections;
using System.ComponentModel;
using System.Windows.Forms;
using System.Data;
using System.Data.SqlClient;
namespace C__Sharp_Examples
public class DataGridUsingForm: System.Windows.Forms.Form
private System.ComponentModel.Container
components;
private System.Data.SqlClient.SqlConnection myConnection;
private System.Data.DataSet myDataSet;
private System.Data.SqlClient.SqlCommand myCommand;
private System.Data.SqlClient.SqlDataAdapter DataAdapter;
private System.Windows.Forms.DataGrid
customerDG;
public DataGridUsingForm ( ]
InitializeComponent ( ) ;
// объявляем строку для подключения к базе
string connectionString = "server=(local)WNetSDK;" +
"Trustedonnection=yes; database=northwind";
// создаем и инициализируем объект Connection
350 Раздел I I I . Программирование для Windows
rr.yConnection - new SqlConnection О ;
myConnection . ConnectionString = connections tiring;
// явно открываем соединение
туСоппест:ion.Open () ;
//создаем объект DataSet
myDataSet = new DataSet();
//создаем объект SqlCommand
myCommand ^ new SqlCommand();
//инициализируем свойство Connection
myComm.and.Connection - myConnection;
//инициализируем свойство CommandText
гсуCommand.CommandText = "Select * From Customers";
// создаем объект DataAdapter
DataAdapter = new SqlDataAdapter();
//задаем SQL команду
DataAdapter.SelectCommand = myCommand;
//задаем имя отображения таблицы
DataAdapter.TableMappings.Add("Table", "Customers")
//заполняем myDataSet данными из базы
DataAdapter.Fill(myDataSet);
// связываем источник данных объекта customerDG с
/'/ таблицей "Customers" объекта ds
customerDG.DataSource -
myDataSet.Tables["Customers"].DefaultView;
protected override void Dispose(bool disposing)
{
if (disposing)
if (components ==• null)
{
components.Dispose();
i
")
base.Dispose(disposing);
private void InitializeComponent(
i
Работа с базами данных 351
this . components -=
new System,Componen~Model.Container ( ) ;
th:.s. customerDG =
new System.Windows.Forms.DataGrid ( ];
customerDG.Beginlnit ( );
custorr.erDG .Location =
new System.Drawing.Poinc |8, 24);
customerDG.Size =
new System.Drawing.Size (656, 224);
customerDG.DataMember = "";
customerDG.Tablndex = 0;
chis.Text = "Using the Data Grid";
this.AutoScaleBaseSize -
new System.Drawing.Size (5, 13);
this.ClientSize = new System.Drawing.Size (672, 273);
this.Controls.Add (this.customerDG);
customerDG.Endlnin ( );
public static void Main(string[] args)
{
Application .Run (new DataGridUsingFom
На этот раз окно приложения будет выглядеть немного иначе. DataGrid
будет содержать больше полей, чем все предыдущие примеры, использующие
базу данных Northwind (см. рис. 33.12).
,il.TON ArtoraoMoie AnlonioMore iOwnei "Matadetos 2 jMexicoD.F
A.i: OLir Around theH ThomasHard Salesflepres 120 Hanovei ^London
LL"iGS Berglundssn ClinitinaBei Order Admini 8erguvsvagen. Lulea
l..AUS Blauer See D HannaMoos SalesReptes Forster;tr. 57 'Mannheim
ILLINP Blondesddsl Fredeiique Ci MaiketingMa 24, place Kle Stiastwurg
L" .iJD • Bolido Cornid • Martin Sonvn Owner U Aiaquil. 67 Madrid
FT'JAP Bonapp' Laurence Leb Owner .12, rue de5 В Marseille
I C ' I 1 i.:'t:m-cl-v I'liaie11-.! I"I..U.JVII:'! 23 Tsawas:e T!a"ja Рис. 33.12. Полный список
записей таблицы Customers
34. ОТЛАДКА ПРОГРАММ
Если вы написали программу, и она заработала у вас с первого раза и
правильно, считайте, что вам повезло. Вы можете считать себя хорошим
программистом, если все ваши программы функционируют правильно
сразу после завершения работы над кодом программы. Однако не всегда
обстоятельства складываются так хорошо. Программирование - это тяжелый
и кропотливый труд, который требует большого опыта и определенного
склада ума. Поэтому, если первая попытка написать полностью
функционирующий код вам не удалась, не расстраивайтесь, все можно
поправить.
Если ваша программа проста в применении и все функции приложения
визуально доступны, то все допущенные ошибки будут видны сразу
после запуска программы.
Давайте рассмотрим программу, созданную как консольное приложение,
которая меняет местами значения двух переменных.
using System;
namespa
class
j
public
int a
inc b
a = b;
b - a,-
ce С Sharprogramming
Exchange
static void Main(]
= 5;
= 8;
Console-WriteLine("a-{0}, b-{l}", a, b];
i
После запуска приложения на экране появится результат:
а=8, Ь=8
Программа явно работает неправильно. Естественно, многие сразу сообразят,
в чем здесь ошибка, и с легкостью устранят ее. Однако давайте
будем последовательны и воспользуемся программным отладчиком для
поиска ошибки.
Для этого нам необходимо запустить программу в пошаговом режиме.
Отладка программ 353
u*4iig system;
плипез price С Sharp Programming
class Exchange
{
public; scacic void Main()
C o n s o l e . 4 r i t e L i n e ( " a - { 0 ) , b - " l " " , a, b).
ПОШАГОВЫЙ РЕЖИМ
34."4t chwi^i "" " " " " -"x Пошаговый режим представsn,_pi,o-rm1n-.ch~4e
-] [**п; З ляет собой процесс исполнения
программы, при котором за один
раз исполняется только одна инструкция.
Для реализации этого
режима нажмите клавишу F10
или выберите пункт меню Debug/
Step Over. Обратите внимание,
что первая инструкция в
теле функции Main окажется выделенной
желтым цветом (рис.
34.1). Тем самым указано место,
с которого начнется выполнение
программы. Также следует обратить
внимание, что строки
объявления используемых модулей,
классов и переменных
обходятся отладчиком, поскольку с ними не связаны действия, которые
могут быть трассированы.
Нажмите клавишу F10 несколько раз и обратите внимание, как движется
выделенная строка от одной к другой.
При пошаговом режиме вы можете заходить в вызываемые функции,
используя клавишу F11 или пункт меню Debug/Step Into. В некоторых
случаях не обязательно заходить в функции - достаточно только следить
за их выполнением, для чего понадобится клавиша F10. Всякий раз при
нажатии этой клавиши выполняется следующая инструкция, но трассировка
вызова функции не происходит. Однако клавиша F11 не даст вам
возможности для трассировки встроенных функций.
Рис. 34.1. Окно трассировки приложения
ТОЧКИ ОСТАНОВА
Как ни полезен пошаговый режим, в больших программах его использование
может быть очень утомительным, особенно если отлаживаемый
участок кода расположен глубоко в программе. Вместо клавиш F10 и F11
для достижения отлаживаемого участка кода гораздо удобнее использовать
точки останова в начале критического участка кода, то есть того
участка, который необходимо отладить. Точка останова, в соответствии
со своим названием, означает остановку выполнения программы. Когда
выполнение программы достигает точки останова, программа прекращает
выполняться до того, как соответствующая строка кода будет выполнена.
Управление возвращается отладчику, что позволяет проверить значение
определенных переменных и начать режим пошаговой отладки.
354 Раздел I I I . Программирование для Windows
Установить точку останова можно на любую инструкцию исполняемого
кода. После задания одной или нескольких точек останова следует запустить
программу при помощи клавиши F5 или меню Debug/Start. Существует
два основных типа точек останова: условные и безусловные.
tC_5herp_Programming Exchange т| j Ф
u s i n g Эузсеш,
neiee space С Sharp Programming
Exchange
public- vaitl Ifain()
consols. toitiisLiTie t"*-{
Рис. 34.2. Подсветка точек останова в программе
Безусловные точки останова
Безусловные точки ос- ...^•''гу..
танова всегда прекращают
выполнение, как только
встречаются в программе.
Существует несколько
способов добавить точки останова
этого типа. Первый
заключается в том, чтобы
поместить курсор на той
строке кода, где надо установить
точку останова. Затем
можно выбрать один
из следующих способов задания
точки останова:
- нажать клавишу F9;
- выбрать пункт меню Debug/
New Breakpoint или
Ctrl+B.
Если вы воспользуетесь клавишей F9, то та строка, где установлена
точка останова, будет выделена цветом. В программе может быть несколько
активных точек останова (рис. 34.2).
Если же вы выберете пункт меню Debug/New Breakpoint, то на экране
появится окно, изображенное на рис. 34.3.
Закладка Function этого окна
предоставляет возможность
установить точку останова на
любую функцию в программе.
Для этого в поле Function: вам
следует ввести имя функции,
при вызове которой программа
должна остановиться. При необходимости
вы можете установить
смещение точки останова
в функции, указав значения
в полях Line и Character. Закладка
File окна New Breakpoint
позволяет установить точку осРис.
З4.з. Окно установки точки останова. танова на любое место в люЗакладка
Function бом файле проекта (рис. 34.4).
New Breakpoint
Отладка программ 355
Для этого следует указать в поле
File имя файла проекта, в который
нужно поместить точку останова, а
в полях Line и Character - указать
номер строки и позицию символа
в строке, на котором устанавливается
точка останова.
Закладки Address и Data позволяют
установить точки останова
на конкретный адрес в программе
или переменную, соответственно.
Их обсуждение выходит за рамки
этой книги, поэтому за более подробной
информацией вы можете
обратиться к MSDN.
New Break point
Рис. 34.4. Окно установки точки останова.
Закладка File
Условные точки останова
Условные точки останова в коде программы позволяют указать условия,
при которых точки останова прекратят выполнение программы, а
также определить действия, которые произойдут при этом. Для прикрепления
к точке останова определенного условия необходимо воспользоваться
уже знакомым вам окном, изображенным на рис. 34.4. Давайте рассмотрим
пример новой программы.
using System;
namespace C_Sharp_Programming
{
class Exchange
public static void MainO
{
int a = 0;
int b = 100;
forjint i = i " 100;
b-;
Console.WriteLine("a={0), b={l}", a, b);
Как вы могли заметить, программа содержит цикл, повторяющийся
100 раз. Допустим, вам необходимо отследить ситуацию, когда значения
356 Раздел I I I . Программирование для Windows
Breakpoint Condition
Рис. 34.5 Set Conditions
переменных а и b совпадают. Заранее
скажу, что это произойдет на числе 50.
Если следовать уже имеющимся у нас
навыкам, то для этого необходимо установить
точку останова на строку
C o n s o l e . И г i t e L i n e C'a=iO}, b = { l ) " , а, Ь);
и просматривать значения переменных
а и b после каждой итерации.
При этом вам придется 50 раз запускать
программу после срабатывания
точки останова. Попробуйте установить
точку останова на указанной строке и достичь в цикле равенства
переменных а и Ь. А что если вместо 100 поставить значение 1 000 000?
Сколько времени вам на это понадобится? Упростить отладку такой программы
помогает наложение
условий на точки останова.
Для установки условия
в окне New Breakpoint существует
кнопка Condition...
При нажатии этой кнопки
на экране появится окно,
изображенное на рис. 34.5.
Для нашего примера введите
в поле Condition строку
условия, как будто описываете
инструкцию внутри блока
if:
а == b
Установите флажок is true
и нажмите ОК. Запустите
программу при помощи клавиши
F5. В консоль выведется
49 строк, пока программа
не остановится. Когда значения переменных а и b сравняются и станут
равными 50, выполнение программы прервется и перейдет в окно отладчика
(рис. 34.6).
Кроме наложения условия на
точку останова, можно установить
точку останова таким образом, чтобы
она срабатывала после выполнения
нескольких итераций цикла.
Для этого необходимо воспользоваться
кнопкой Hit Count..., расположенной
в окне New Breakpoint
(рис. 34.4). Перед вами появится
j^J^Shajp^Ffogramming Exchange J*] j •
•jiii.g System;
а а к к з р а с е C_3hacp_Progr:ainminH
! class Exchange
jiubii;; static vosd Main ()
i n с а = 0 ;
Ш b = 1OO;
i n [in- i = 0, l " 100,
tot.
Рис. 34.6. Окно отладчика при срабатывании условия
точки останова
Bieakpoint ml Count
_ P
• i f
break when the hit count a equal to
break when the hit count is a multiple с
break when the hit count is orealer thj ;_
окно, изображенное на рис. 34.7.
Рис. 34.7. Окно настройки количества повторений
цикла
Отладка программ 357
По умолчанию, в списке выбора типа повторений установлено значение
break always (всегда). Это означает, что программа будет останавливаться
на каждой итерации цикла. Если вы выберете пункт break when the hit count
is equal to, то программа остановится на точке останова после выполнения
указанного числа итераций. Если вы выберете пункт break when the hit
count is a multiple of, то программа будет останавливаться лишь на тех итерациях,
значение которых без остатка делится на указанное. Так, если вы
укажете число 2, то программа будет останавливаться на каждой четной
итерации цикла, если же укажете число 10, то программа будет останавливаться
на каждой 10 итерации цикла. Последним пунктом списка является
элемент break when the hit count is greater than or equal to. Выбор этого
пункта заставит программу останавливаться на точке останова, если количество
итераций цикла будет равным или превысит указанное значение.
Рассмотрим все тот же пример. Выберите в представленном списке
пункт break when the hit count is equal to. Установите в поле для ввода
значение 50. Запустите программу при помощи клавиши F5. Программа
прервет свое выполнение на 50-й итерации.
|$?C_ShafP
"if ,
iill
Si
ii
"ftograrrrrm
:i Syste
врасе С
ig.Exchange jgjfij •-•Mainfl j§
'a;
Sharp
азз Exchange
pub 1ic
\
mt a
inn b
for [ i
"
a+-t
ED3 0
it i -
Programming
void IIain()
0; i " 100; i++) :
| (local variable] inli = Q|
ПРОСМОТР ПЕРЕМЕННЫХ
Во время отладки обычно не- [^"й^"ЩЩЩ"
обходимо видеть значения переменных
программы. Visual Studio.
NET позволяет легко справиться
с этой задачей. Одна из
возможностей просмотра переменных
- это всплывающая подсказка,
которая появляется при
наведении курсора мыши на название
переменной в коде программы.
Воспользуемся все тем же примером.
Вы можете установить
точку останова на строку щ " ' ^
Console.WriteLine ("a-{0} , b= {1} ", '1^;Ж;ШиШ^^ш;йМ.'1:^:^ 1. l:Zd:l:l:iicJ;.:^i^-J^&
a, b) ;
и запустить программу при
помощи клавиши F5. Программа
остановит свою работу, как только
достигнет точки останова, и вы сможете увидеть значения переменных.
Для этого подведите указатель мыши к переменной а в любом месте кода
программы. При этом появится подсказка с указанием имени переменной
ее типа и значением (см. рис. 34.8).
Второй, более обширной, возможностью просмотра значений переменных,
является использование специального окна просмотра переменных (рис. 34.9).
Рис. 34.8. Просмотр значений переменных
в рабочей области программы
358 Раздел I I I . Программирование для Windows
J
Рис. 34.9. Окно просмотра переменных
По умолчанию, это окно содержит три
закладки:
- Autos;
- Locals;
- Watchl.
Закладка Autos содержит все переменные,
которые модифицировались в предыдущем
действии или будут модифицироваться
в следующем. В предыдущем примере такими переменными являются
переменные а и Ь. При переходе от одного участка кода к другому
содержимое окна Autos автоматически обновляется в зависимости от производимого
действия в трассируемой области.
Закладка Locals содержит все локальШШИЯМИ*вИ1ИИИвИриИ
ные переменные, видимые в трассируемой
^ ^ ^ н п ^ ^ ^ ^ ^ ^ ^ н г г ^ в области программы. Для нашего случая
локальными переменными являются a, b, i
(рис. 34.10).
Закладка Watchl, по умолчанию, пуста.
Она предназначена для просмотра переменных,
определяемых программистом.
Для просмотра значения необходимой переменной
установите курсор мыши в поле
Name выделенной строки и введите имя переменной. Ее значение сразу же
отобразится в поле Value. Кроме того, в поле Name вы можете задавать
любые выражения, содержащие видимые переменные, константы, вызовы
функций. Например, так, как изображено на рис. 34.11.
Все вышеперечисленные окна позволяют изменять значения представленных
в них переменных. Если вы измените значение переменной в
окне просмотра, то изменится и конкрет- , .. ., , .
ное значение переменной в памяти. Для
изменения значения переменной необходимо
щелкнуть указателем мыши по значению
переменной в поле Value. При этом
поле перейдет в режим редактирования и
вы сможете модифицировать значение переменной.
Рис. 34.10. Окно просмотра локальных
переменных
Рис. 34.11. Вычисление сложного
выражения в окне Watchl
СТЕК ВЫЗОВА ФУНКЦИЙ
Очень часто необходимо отладить участок кода в функции, вызов которой
предваряется вызовом многих других функций. Давайте рассмотрим
следующий пример:
using System;
namespace С Sharp_Programming
Отладка программ 359
class Тез!
public void f1()
f 2 () ;
public void f2()
t
Console.WriteLine ("f 2 выполняется"! ;
class TestApp
i
public static void Mainf)
{
Test test - new Testf);
test.fl();
Console"\pplcalion1 ei'BlC_Sharp_Piogranining Test 11 [) Line 10 С
Cot isole^ pplicationi exetC_Sharp_Pmgiammir"g TesJApp Manj] Lue С
Рис. 34.12. Стек вызова функций
Здесь функция Main класса TestApp
вызывает функцию fl класса Test. В
свою очередь функция fl вызывает
функцию fl. В больших программах
вложенность функций будет намного
выше. Бьтает очень полезно посмотреть,
какая именно функция вызвала
ту функцию, которую вы трассируете.
Для этого Visual Studio .NET содержит окно стека вызова функций
{Call Stack). Это окно содержит упорядоченный, по очередности вызова,
список функций. Установите в приведенном выше примере точку останова
на строку
Console.WriteLine ("f2 выполняется");
внутри функции f2. Запустите программу при помощи клавиши F5. Когда
программа остановится на точке останова, взгляните на окно Call Stack
внизу среды разработки Visual Studio .NET. Оно должно иметь вид, представленный
на рис. 34.12.
Список содержит названия вызванных функций, записанных в обратном
порядке. Первой была вызвана функция TestApp.Main, которая вызвала
функцию Tets.fl, та, в свою очередь, вызвала функцию Test.f2, в которой
сейчас и находится программа. Вы можете перейти назад по стеку вызова
функций, щелкнув два раза указателем мыши по имени функции в списке.
При переходе по стеку вызову функций изменяются и окна автоматических
и локальных переменных.
ТАК ЧТО ЖЕ ЛУЧШЕ, С# ИЛИ Java?
Microsoft описывает С# как "простой, современный объектно-ориентированный
и типо-безопасный язык программирования, наследник С и
C++". Такое утверждение не хуже подходит и к Java. Как показывает
следующий пример, возможности и синтаксис языков похожи.
Пример Hello World! на С#:
public class HelloWorldTest
{
public static void Main (string!! args)
{
System.Console.WriteLine("Здравствуй, мир!");
}
}
Аналогичный пример на Java:
public class HelloWorldTest
{
public static void main (String[j args)
{
System.Out.printIn("Здравствуй, мир!");
}
\
Но сходство идет дальше синтаксиса, ключевых слов и разделителей.
Оно включает такие общие возможности Java и С#, как:
• Автоматическая сборка мусора (garbage collection),
• Механизм отражения (Reflection) для описания информации о типах.
• Компиляция исходного кода в промежуточный байт-код.
• ЛТ-компиляция байт-кода в собственно код.
• Исполнение кода в специальной защищенной среде.
• Все должно лежать в классе - никаких глобальных функций и данных.
• Отсутствие множественного наследования, хотя реализация нескольких
интерфейсов и возможна.
• Дерево объектов с единым корнем.
• Специальные операторы для защиты кода и данных.
• Использование исключений для обработки ошибок.
• Ключевые слова package/namespace для предотвращения конфликтов
типов.
• Соглашение о применении комментариев внутри кода в качестве документации.
• Проверка границ массивов.
• Встроенные библиотеки для работы с GUI, сетями, потоками и т. п.
Так что же лучше, С# или Java? 361
Отсутствие неинициализированных переменных. Если программист не
инициализировал переменную, она автоматически инициализируется
компилятором.
По умолчанию, использование указателей запрещено.
Использование package/namespace для ссылок на внешние библиотеки
и компоненты вместо применения заголовочных файлов.
Использование точки вместо операторов C++ "-"" и "::".
Ужесточение контроля типов. Так, в операторах if нельзя использовать
целочисленные значения без явного приведения их к типам
boolean/bool.
С#: ЭВОЛЮЦИЯ Visual J++
С чего Microsoft решил, что нам нужен новый язык? Microsoft вложил
уйму сил и средств в проект Visual J++, объявленный в октябре 1996
года. Эти усилия произвели на свет самую быструю JVM на рынке и
Windows Foundation Classes (WFC), набор Java-классов, оберток для Win32
API. He случайно Андерс Хиджисберг, руководитель проекта WFC (более
известный как автор Turbo Pascal), стал главным архитектором С#, ввиду
чего С# немало унаследовал и от Turbo Pascal.
В Microsoft решили внести изменения в Java для более тесной интеграции
с Windows. Вы уже знаете, почему. Некоторые изменения - бесшовное
сопряжение
...Закладка в соц.сетях