2009-04-23 3 views
3

Я программист на C++, перемещающийся в C#. Я работал с языком в течение месяца и понимал многие концепции.Сюрпризы Перемещение с C++ на C#

Какие сюрпризы я могу получить, перейдя с C++ на C#? Меня предупредили о том, что деструкторы не исполняются, как я и предполагал. Недавно я попытался сделать что-то с дженериками, которые будут использовать T в качестве базового класса. Это не сработало. У меня также была другая проблема, но я сделаю это до неопытности в C#. Я также был удивлен, что в моем приложении есть RAM, затем я понял, что мне нужно использовать .dispose в одной функции. (Я думал, что он будет чист, как умный указатель)

Что еще может меня удивить?

Пожалуйста, не избивайте язык. Я сомневаюсь, что любой будет, но на всякий случай ...

ответ

3

Я думаю, вы накрыли главный. Вы должны прочитать сборку мусора, понять, почему нет деструкторов как таковых, выяснить шаблон IDisposable (какой тип заменяет деструкторы). Я бы сказал, что это был большой.

Единственное, что я хотел бы сказать, это предупредить вас, что C# и библиотека базового класса .Net довольно велики, чтобы извлечь максимальную пользу из этого, есть чему поучиться ... После того, как вы осветили основы сбора мусора и системы типов, которые вы хотите посмотреть в LINQ, и вы должны потратить время на изучение библиотек/фреймворков соответствия для вашей области (например, WPF, WCF, ASP.Net и т. д.). Но все хорошо. Я перешел с C++ на C# и никогда не вернусь, я нахожу его более продуктивным (я не бичу C++, я все еще dable :-))

0

Различия в объектной модели. Например, значения и ссылочные типы являются отдельными по определению, а не тем, как они создаются. У этого есть некоторые неожиданности, например.

myWinForm.Size.Width = 100; 

не изменит ширину, вам нужно создать экземпляр нового размера и назначить его.

+0

Ну, это не скомпилируется ни ... компилятор видит этот тип ошибки. Кроме того, вы просто установите myWinForm.Width ;-p –

4

К счастью, у Microsoft есть информация об этом здесь: C# for C++ Developers.

Различия между структурами и классами являются еще одним важным для происхождения C++.

1

Я сделал почти то же изменение несколько месяцев назад (до этого я внес изменения в Java, но я действительно не тратил много времени на программирование Java).

Вот некоторые из самых больших ловушек я столкнулся:

Attribute против Variable против сеттер

Одна из самых больших ловушек я шаговая в было знать, если вы должны изменить атрибут или установить переменную или использовать установщик для установки некоторого аспекта класса.

IList против Списка против других коллекций

знать разницу между IList, List и всеми другими коллекциями (IMO вы не можете сделать много с IList).

Дженерики есть свои подводные камни

И если вы планируете использовать много дженериков, может читать это поможет вам избежать некоторых моих ошибок: Check if a class is derived from a generic class

Но в целом я бы говорят, что смена прошла довольно безболезненно.

1

Ну, языки совершенно разные, так как я уверен, что вы поняли, что работали с C# в любое время. У вас нет мощного макроса или шаблонов (я понимаю, что в C# есть дженерики) на C#, как в C++. Что касается памяти, помните, что вы больше не находитесь в строго контролируемой среде. Ожидайте увидеть много использования памяти в диспетчере задач и аналогичных инструментах, это нормально. Есть лучшие, более мелкозернистые счетчики производительности, чтобы увидеть истинное использование памяти. Кроме того, вам, вероятно, не нужно вызывать dispose столько, сколько вы могли бы подумать (кстати, проверить «использование» блоков, если вы еще этого не сделали).

Другой ясно один конструктор по умолчанию, в C# это не создает новый объект Foo:

Foo myFoo; 

Вы не можете иметь ничего похожего на «пустой указатель», если вы просто не думать о том, что как например, иметь ссылку на объект типа. Кроме того, вам нужно подумать о свойствах как синтаксическом сахаре для методов, а не о публичных членах, поскольку они выглядят в синтаксисе C++.

Убедитесь, что вы понимаете параметры «вне» и «ref».

Очевидно, что это не большой список, всего несколько «указателей» (каламбур не предназначен).

1

Это довольно большая тема. Несколько мыслей:

C# сбор мусора. Не означает, что вы можете перестать обращать внимание на распределение ресурсов, но в целом вам не нужно беспокоиться почти столько же о наиболее распространенном ресурсе: памяти.

В C# Все является объектом. Нет «примитивных» типов данных, даже int является объектом.

У C# есть дженерики, а не шаблоны. Шаблоны намного богаче и сложнее, чем аналогичные синтаксические генерики C#, но дженерики по-прежнему обеспечивают практически всю практическую полезность шаблонов без многих головных болей.

C# имеет интерфейсы и одиночное наследование. Где вы можете посмотреть на множественное наследование в C++, вместо этого посмотрите на использование интерфейсов или другой шаблон проектирования (например, стратегию).

В C# есть делегаты вместо указателей функций. Делегат - это всего лишь типизированный указатель на функцию. Использование делегатов и делегатов-родственников (лямбда-выражения, события, предикаты и т. Д.) Очень мощно и стоит приложить значительные усилия для изучения.

C# поддерживает возврат доходности. Это очень важно для C#. Наиболее распространенной формой итерации над некоторым набором является использование foreach. Стоит понять, как работают IEnumerable и iterators.

0

Некоторые вещи, которые я не видел упомянутые, которые не доступны в C++ и может быть немного удивляют attributes и reflection

Атрибуты как таковые не дают полноценного AOP. Тем не менее, они позволяют решать множество проблем таким образом, который сильно отличается от того, как вы решаете их на C++.