Сходства и отличия C# и Java
Автор: Илья Евсеев.
Сходства
- принудительный ООП-стиль - все функции должны быть методами классов,
все классы без предка автоматически становятся наследниками класса Object;
- служебные классы, которыми пользуются компилятор и среда выполнения:
Object, Class, StringBuffer, String
(допустимо:
String s = "KissMe".toLowerCase();
) и т.д.;
- использование ссылок как единственный (кроме наследования)
способ связи между объектами - нет ни указателей,
ни непосредственного включения одного объекта в другой в виде поля;
- необходимость явно создавать объекты оператором new:
Window w();
- недопустимо,
- требуется:
Window w = new Window();
.
- безымянные классы, определяемые в месте использования;
- сборка мусора, основанная на автоматическом подсчёте ссылок;
- компиляция в байт-код;
- отсутствие адресной арифметики;
- отсутствие множественного наследования;
- избыточная информация о классах, методах, аргументах
генерируется компилятором и доступна приложению в момент выполнения;
- действия над атомарными базовыми типами собраны в классы-контейнеры
(
String s = Integer.toString(i)
в Java,
int i = int.Parse(s)
в C#);
- inline-документация в комментариях исходного текста.
Отличия C#
- перечислимые типы с ключевым словом
enum
;
- структуры, объявляемые с ключевым словом
struct
- не имеют стартовых значений для полей,
хранятся и передаются не по ссылке, а по значению;
- виртуальные и перегружаемые методы обязаны иметь
атрибуты
virtual
и override
(и это, на мой взгляд, правильно);
- возможность определять в классе-наследнике
поле или метод с таким же именем, как и в классе-родителе,
не замещая оригинал в таблице виртуальных методов,
с помощью атрибута
new
;
- возможность передавать аргументы по ссылке
с помощью ключевого слова
ref
;
- возможность определять собственные действия для операторов аналогично C++;
- операции сравнения (
if (s1 == s2) {...}
),
слияния ( s1 = s2 + s3
)
и проч. для строк и других стандарных типов;
- встроенный синтаксис для перебора элементов в коллекциях:
foreach(String s in myStringArray) { ... }
;
- поддержка свойств:
public int A { get { ... } set { ... } }
- передача и хранение ссылок на методы в переменных типа
delegate
(также сохраняется ссылка на объект,
применительно к которому должен быть вызван метод);
- встроенная поддержка списков слушателей (однотипных методов,
принадлежащих другим объектам, вызываемых для оповещения при событии)
с помощью ключевого слова
event
и переопределённого оператора +=
;
- не требуется перечислять в заголовке метода генерируемые исключения;
- возможность добавлять через атрибуты класса
классы-генераторы дополнительного поведения
(
[Serializable()] class C {...}
),
в т.ч. собственные;
- директивы условной компиляции -
#if, #else, #endif
.
- дополнительное структурирование исходного текста с помощью
#region
;
- в одном файле может находиться несколько публичных классов
(спорный вопрос - хорошо это или плохо);
- для разметки документации в комментариях используется не HTML, а XML;
- unsafe-методы для оптимизации с адресной арифметикой и системными вызовами;
- прямая интеграция с ActiveX под Windows;
- несколько входных языков для общей среды выполнения:
C#, VB, C++; планируется Delphi от Borland;
- генерация кода как для CLI, так и для x86.
Мелкие прелести миграции :-)
- Java: public Object clone() {...}
- C#: public object Clone() {...}
Версии документа
- 16 августа 2004 - первая версия;
- 17 августа 2004 - вторая версия: enum, struct, virtual/override, new;
- 18 августа 2004 - третья версия: delegate, event.
На этом пока всё. Конструктивная критика приветствуется!