Re: C#
Вот мы говорим про: "C# или С++?". Я нашел интересную статью по этому поводу и предлагаю вам прочитать ее:
Последнее время С и С++ являются наиболее используемыми языками для разработки коммерческих и бизнес приложений. Эти языки устраивают многих разработчиков, но в действительности не обеспечивают должной продуктивности разработки. К примеру, процесс написания приложения на С++ зачастую занимает значительно больше времени, чем разработка эквивалентного приложения, скажем, на visual basic. Сейчас существуют языки, увеличивающие продуктивность разработки за счет потери в гибкости, которая так привычна и необходима программистам на С/С++. Подобные решения являются весьма неудобными для разработчиков и зачастую предлагаются значительно меньшие возможности. Также эти языки не ориентированы на взаимодействие с появляющимися сегодня системами и очень часто они не соответствуют существующей практике программирования для web. Многие разработчики хотели бы использовать современный язык, который позволял бы писать, читать и сопровождать программы с простотой visual basic и в то же время давал бы мощь и гибкость c++, обеспечивал бы доступ ко всем функциональным возможностям системы, взаимодействовал бы с существующими программами и легко работал бы с возникающими web стандартами.
Учитывая все подобные пожелания, microsoft разработала новый язык - c#. В него входит много полезных особенностей - простота, объектная ориентированность, типовая защищенность, "сборка мусора", поддержка совместимости версий и многое другое. Данные возможности позволяют быстро и легко разрабатывать приложения, особенно com+ приложения и web сервисы. При создании c#, его авторы учитывали достижения многих других языков программирования: c++, c, java, smalltalk, delphi, visual basic и т.д. Надо заметить что по причине того, что c# разрабатывался с чистого листа, у его авторов была возможность (которой они явно воспользовались), оставить в прошлом все неудобные и неприятные особенности (существующие, как правило, для обратной совместимости), любого из предшествующих ему языков. В результате получился действительно простой, удобный и современный язык, по мощности не уступающий С++, но существенно повышающий продуктивность разработок.
web интеграция
Ввиду своего очень удобного объектно-ориентированного дизайна, c# является хорошим выбором для быстрого конструирования различных компонентов - от высокоуровневой бизнес логики до системных приложений, использующих низкоуровневый код. Также следует отметить, что c# является и web ориентированным - используя простые встроенные конструкции языка ваши компоненты могут быть легко превращены в web сервисы, к которым можно будет обращаться из internet посредством любого языка на любой операционной системе. Дополнительные возможности и преимущества перед другими языками приносит в c# использование передовых web технологий, таких как: html (hypertext markup language), xml (extensible markup language ) и soap (simple object access protocol). Среда разработки web сервисов позволяет программисту смотреть на существующие сегодня web приложения, как на родные c# объекты, что дает возможность разработчикам соотнести имеющиеся web сервисы с их познаниями в объектно-ориентированном программировании.
Исключение ошибок
Очень часто можно прослеживать такую связь - чем более язык защищен и устойчив к ошибкам, тем меньше производительность программ, написанных на нем. К примеру рассмотрим две крайности - очевидно это assembler и java. В случае с java - вы получаете защищенность, независимость от платформы, но скорость вашей программы вряд ли совместима со сложившимся представлением о скорости, например какого-либо отдельного клиентского приложения (конечно существуют оговорки - jit компиляция и прочее). Рассмотрим c++ с этой точки зрения - на мой взгляд соотношение в скорости и защищенности близко к желаемому результату, но на основе собственного опыта программирования я могу с уверенностью сказать, что практически всегда лучше понести незначительную потерю в производительности программы и приобрести такую удобную особенность, как "сборка мусора", которая не только освобождает вас от утомительной обязанности управлять памятью вручную, но и помогает избежать вам многих потенциальных ошибок в вашем приложении. В действительности скоро "сборка мусора", да и любые шаги к устранению потенциальных ошибок становятся отличительными чертами современного языка. В c#, как в несомненно современном языке, также существуют характерные особенности для обхода возможных ошибок. Например, помимо упомянутой выше "сборки мусора", там все переменные автоматически инициализируются средой и обладают типовой защищенностью, что позволяет избежать неопределенных ситуаций в случае, если программист забудет инициализировать переменную в объекте или попытается произвести недопустимое преобразование типов. Также в c# были предприняты меры для исключения ошибок при обновлении программного обеспечения. Изменение кода, в такой ситуации, может непредсказуемо изменить суть самой программы. Чтобы помочь разработчикам бороться с этой проблемой c# включает в себя поддержку совместимости версий (vesioning). В частности, в отличии от c++ и java, если метод класса был изменен это должно быть специально оговорено. Это позволяет обойти ошибки в коде и обеспечить гибкую совместимость версий. Также новой особенностью является native поддержка интерфейсов и наследования интерфейсов. Данные возможности позволяют разрабатывать сложные системы и развивать их со временем.
Особенности и примеры использования
Переходя к более подробному знакомству с c#, традиционно рассмотрим программу "hello, world":
using system;
class hello{
static void main() {
console.writeline("hello, world");
}
}
Поместите эту программу в файл hello.cs и скомпилируйте ее командой
csc hello.cs
В результате вы получите файл hello.exe, запустив который, вы увидите надпись "hello, world".
В c# была унифицирована система типов, теперь вы можете рассматривать каждый тип как объект. Несмотря на то, используете вы класс, структуру, массив или встроенный тип, вы можете обращаться к нему как к объекту. Объекты собраны в пространства имен (namespaces), которые позволяют программно обращаться к чему-либо. Это значит что вместо списка включаемых файлов заголовков в своей программе вы должны написать какие пространства имен, для доступа к объектам и классам внутри них, вы хотите использовать. В c# выражение using позволяет вам не писать каждый раз название пространства имен, когда вы используете класс из него. Например, пространство имен system содержит несколько классов, в том числе и console. И вы можете писать либо название пространства имен перед каждым обращением к классу либо использовать using как это было показано в примере выше.
Статический метод main - точка входа в программу. Этот метод обязательно должен быть статическим. Далее в нашем примере используется метод writeline из класса system.console. Этот метод отправляет строку на стандартный вывод.
Простота использования
Важной и отличительной от С++ особенностью c# является его простота. К примеру, всегда ли вы помните, когда пишите на С++, где нужно использовать "->", где "::", а где "."? Даже если нет, то компилятор всегда поправляет вас в случае ошибки. Это говорит лишь о том, что в действительности можно обойтись только одним оператором, а компилятор сам будет распознавать его значение. Так в c#, оператор "->" используется очень ограничено (в unsafe блоках, о которых речь пойдет ниже), оператор "::" вообще не существует. Практически всегда вы используете только оператор "." и вам больше не нужно стоять перед выбором.
Еще один пример. При написании программ на c/С++ вам приходилось думать не только о типах данных но о их размере в конкретной реализации. В c# все упрощено - теперь символ unicode называется просто char (а не wchar_t, как в С++) и 64-битное целое теперь - long (а не __int64). Также в c# нет знаковых и беззнаковых символьных типов.
В c#, также как и в visual basic после каждого выражения case в блоке switch подразумевается break. И более не будет происходить странных вещей если вы забыли поставить этот break. Однако если вы действительно хотите чтобы после одного выражения case программа перешла к следующему вы можете переписать свою программу с использованием, например, оператора goto.
Еще одно упрощение - в c# не существует множественного наследования классов. В действительности его использование является вовсе не самой простой задачей и зачастую приводит к ошибкам. Вместо этого в c# принята полная поддержка концепций com+, которые исключают необходимость использования множественного наследования.
Многим программистам (на тот момент, наверное, будущим программистам) было не так легко во время изучения c++ полностью освоиться с механизмом ссылок и указателей. Многие путались в использовании операторов "*" и "&". В c# (кто-то сейчас вспомнит о java) нет указателей. В действительности нетривиальность указателей соответствовала их полезности. Например, порой, трудно себе представить программирование без указателей на функции. В соответствии с этим в c# присутствуют delegates - как прямой аналог указателя на функцию, но их отличает типовая защищенность, безопасность и полное соответствие концепциям объектно-ориентированного программирования . Рассмотрим пример их использования:
delegate void simpledelegate(); /* здесь мы объявляем тип delegate -
принимаемые значения и возвращаемый тип */
class test {
static void f() {
system.console.writeline("test.f");
}
static void main() {
simpledelegate d = new simpledelegate(f); /* создание объекта -
delegate */
d(); // Запуск delegate
}
}
delegates это объекты, производные от общего базового объекта system.delegate. Этот тип являет собой некую сущность, которую можно вызывать. В случае с экземпляром объекта - эта сущность состоит из экземпляра и его метода, в случае статического метода - из класса и статического метода этого класса. Именно благодаря этому не нарушатся концепции объектно-ориентированного программирования, а именно не используются методы объекта в отрыве от самого объекта.
Типовая защищенность
Вы можете не согласиться, но на мой взгляд типовая защищенность способствует написанию устойчивых программ. К примеру, в c# все динамические объекты и массивы автоматически инициализируются нулем. Несмотря на то, что c# автоматически не инициализирует локальные переменные, компилятор выдаст вам предупреждение, если вы попытаетесь использовать их до инициализации. Также, при обращению к массиву, выполняется проверка на выход за его границы. Таким образом в c#, в отличие от С++, невозможно изменить не отведенную для вас память.
В c# вы не можете создать ссылку на произвольную область памяти. Все приведения типов должны быть безопасными. К примеру, вы не можете использовать приведение между reference (обращение по указателю на область памяти) и value (обращение к значению) типами. "Сбор мусора" обеспечит отсутствие в вашем коде болтающихся впустую ссылок.
Типовая защищенность сильно связана с контролем на переполнение. Не допускаются арифметические операции, которые будут переполнять допустимое значение переменной или объекта. Хотя, конечно, существует лишь неполный набор факторов, которые говорят о явном переполнении переменной. Если же вам не нравится такая проверка - вы можете ее отменить.
Вообще, типы данных, присутствующие в c#, отличаются от типов в c++. Так тип char тут 16-битный, а весьма полезные типы string и decimal являются встроенными. Но куда большие отличия мы можем увидеть при рассмотрении массивов. В c# могут быть многомерные массивы (multidimentional) и неровные (или неуточненные - jagged - массивы массивов):
int[ ] intarray; // Просто массив
int[ , , ] intarray; // Трехмерный массив
int[ ][ ] intarray; // неровный массив массивов
int[ ][ , , ][ , ] intarray; /* Одномерный массив трехмерных массивов
двумерных массивов
*/
В принципе, использование массивов ничего нового из себя не представляет, но было бы полезно рассмотреть пример инициализации неровного массива:
int[][] intarray = new int[][] {
new int[] {2,3,4}, new int[] {5,6,7}
};
В c# появился оператор циклов foreach - перебор всех элементов "списка". Его использование зависит от типов объектов, к которым он применяется, по причине того, что понятие "списка" может быть определено по разному. Проиллюстрируем его действие на примере:
int[] intarray = {2, 4, 6, 8, 10, -2, -3, -4, 8};
foreach (int i in intarray) {
system.console.writeline(i); // Вывод элементов массива по порядку
}
Удобство и современность c#
Хотелось бы подчеркнуть современное удобство c#. Когда вы начнете работу с c#, а надеюсь это произойдет как можно скорее, вы увидите, что довольно большое значение в нем имеют пространства имен. Уже сейчас, на основе первого примера, вы можете судить об этом - ведь все файлы заголовков заменены именно пространством имен. Так в c#, помимо просто выражения using, предоставляется еще одна очень удобная возможность - использование дополнительного имени (alias) пространства имен или класса. Следующие примеры продемонстрируют это:
namespace ns3 { /* предположим, что у нас имеется вложенное пространство имен
ns1.ns2, в котором находится classa */
using a = ns1.ns2.classa; // Определяем дополнительное имя для класса
class classb: a {} // Используем его
}
namespace ns3 { // или на уровне пространств имен
using c = ns1.ns2; // Определяем дополнительное имя для пространства имен
class classb: c.classa {} // Используем его
}
Современность c# проявляется и в новых шагах к облегчению процесса отладки программы. Традиционым средством для отладки программ на стадии разработки в c++ является маркировка обширных частей кода директивами #ifdef и т.д. В c#, используя атрибуты, ориентированные на условные слова, вы можете куда быстрее писать отлаживаемый код. Покажем это на примере:
<Код из первого файла>
using system;
namespace dotsiteres {
public class helloworld {
[conditional("debug")] /* последующий метод будет выполняться
только в случае определения debug */
public static void sayhi() {
console.writeline("hello, world!");
return;
}
...
}
}
<Код из второго файла>
using system;
using dotsiteres;
#define debug
class callingdotsiteres {
public static void main(string[] args) {
helloworld.sayhi();
return;
}
}
В данном случае будет выведена строка "hello, world". Если бы debug не было определено, ничего бы не произошло. Не менее полезное использование атрибутов будет продемонстрировано далее.
В наше время, когда усиливается связь между миром коммерции и миром разработки программного обеспечения, и корпорации тратят много усилий на планирование бизнеса, ощущается необходимость в соответствии абстрактных бизнес процессов их программным реализациям. К сожалению, большинство языков реально не имеют прямого пути для связи бизнес логики и кода. Например, сегодня многие программисты комментируют свои программы для объяснения того, какие классы реализуют какой-либо абстрактный бизнес объект. c# позволяет использовать типизированные, расширяемые метаданные, которые могут быть прикреплены к объекту. Архитектурой проекта могут определяться локальные атрибуты, которые будут связанны с любыми элементами языка - классами, интерфейсами и т.д. Разработчик может программно проверить атрибуты какого-либо элемента. Это существенно упрощает работу, к примеру, вместо того чтобы писать автоматизированный инструмент, который будет проверять каждый класс или интерфейс, на то, является ли он действительно частью абстрактного бизнесс объекта, можно просто воспользоваться сообщениями основанными на определенных в объекте локальных аттрибутах. Следующий пример иллюстрирует это:
using system;
[attributeusage(attributetargets.all)]
/* Здесь уже пример использования аттрибутов - с их помощью мы говорим
где может применяться наш атрибут-класс, определяемый ниже */
public class helpattribute: attribute {
/*аттрибут-класс - наследник класса system.attribute. Необходимо
заметить, что в helpattribute, help является непосредственным именем
аттрибут-класса, а attribute - суффиксом. При использовании
аттрибут-класcа helpattribute вы сможете обращаться к нему коротко -
просто help. */
public helpattribute(string url) {
this.url = url;
}
public string topic = null;
private string url;
public string url {
get { return url; }
}
}
[help("http://www.mycompany.com/:/class1.htm")] /* Применение нашего аттрибута
к новому классу */
public class class1 {
[help("http://www.mycompany.com/:/class1.htm", topic = "f")]
/* Применение нашего аттрибута к методу */
public void f() {}
}
class test { // Класс, проверяющий аттрибуты
static void main() {
type type = typeof(class1);
object[] arr = type.getcustomattributes(typeof(helpattribute));
/* прочтение аттрибутов класса class1 */
if (arr.length == 0)
console.writeline("class1 has no help attribute.");
else {
helpattribute ha = (helpattribute) arr[0];
// Вывод аттрибутов
console.writeline("url = {0}, topic = {1}", ha.url, ha.topic);
}
}
}
Дополнительные возможности
Реальный опыт разработки говорит нам о том, что некоторым программам и по сей день требуется native код, либо из соображений производительности, либо для взаимодействия с существующими api. Эта причина может заставить разработчиков использовать С++ даже когда они предпочли бы более продуктивную среду разработки. В С# для решения этой проблемы были приняты несколько решений: включена native поддержка com-технологии и winapi, допускается ограниченно использовать native указатели. Разработчику больше не нужно точно реализовывать iunknown и другие com интерфейсы. Теперь эти особенности являются встроенными. Также c# программы могут органично использовать существующие com объекты независимо от того, на каком языке они были написаны. Для тех разработчиков которым это необходимо, в c# была включена специальная особенность, которая позволяет программе обращаться к любому существующему native api. Внутри специально помеченного блока (unsafe) программисту позволяется использовать указатели и традиционные особенности С/С++, такие как, управление памятью вручную и арифметика указателей. Этот большой плюс отличает c# от других сред разработки. Вместо того, чтобы отказаться от уже существующего С/С++ кода, вы можете разрабатывать c# приложения используя его. Ниже демонстрируется использование unsafe блоков:
struct point{
public int x;
public int y;
public override string tostring() {
return "(" + x + "," + y + ")";
}
}
class test {
unsafe static void main() {
point point;
point* p = &point;
p->x = 10;
p->y = 20;
console.writeline(p->tostring());
}
}
Как вы увидели, внутри unsafe блоков, как и в c++, возможно использование указателей. Также допускается и использование оператора "->", который может быть заменен "(*p).".
Заключение
В заключение, я хотел бы поздравить вас - теперь вы имеете представление о c# - языке следующего поколения. В данной статье было рассказано о многих его возможностях, но смею вас уверить - далеко не всех. Надеюсь, к этому моменту вы уже обладаете желанием использовать c# в своих разработках. Мы планируем выпустить цикл статей и документации, которые вы очень скоро увидите на этом сайте. Обратившись к ним, вы сможете ознакомиться поближе с c# и примерами его использования в самых разных сферах.
31 октября этого года c# был стандартизован. Сейчас доступна его спецификация на английском языке, вы можете найти ее на сайте microsoft. Там же вы можете скачать microsoft visual studio .net beta 1 и уже сегодня начать работу с c# и microsoft .net framework.
Ссылка на статью в интернете:
You must be registered for see links
.