Каковы наиболее распространенные или порочные ошибки, когда опытные программисты на С++ развиваются в С#?
Наиболее распространенные или порочные ошибки в разработке С# для опытных программистов на С++
Ответ 1
- разница между
struct
иclass
в двух - разница между алиасом
using
и atypedef
- Когда мои объекты собираются? как я могу их уничтожить сейчас?
- насколько велика
int
? (он определен в С#) - Где мой компоновщик? (на самом деле у Mono есть полный компоновщик AOT для некоторых сценариев).
Ответ 2
Я видел много кодовых кодов С++ в стиле COM на С#, пытаясь справиться с неадекватными языками. С# предоставляет много безопасную поддержку типов для ваших перечислений, и обычно есть более удобные API, а затем P/Invoking обратно на С++.
Другая вещь, которую я видел, улавливает большинство людей, так это то, что генераторы С# не являются шаблонами.
Ответ 3
Вызов GC.Collect
.
Ответ 4
- Использование структур в пользу классов все время.
- Использование параметров in, out и ref все время (это результат точки 1).
- Использование значений int в качестве условий ошибки вместо использования исключений
- Использование ключевого слова virtual вместо ключевого слова.
- Мысль о том, что char - это 8-значное знаковое значение.
Ответ 5
Думая, что "сбор мусора" = "Мне никогда не придется беспокоиться о жизни объекта вообще". Например, откройте FileStream
и забудьте закрыть его.
Или:
- Выделение множества объектов
- Поместите их в большой глобальный словарь (обычно после "Я знаю, я сделаю кеш" )
- Удивительно, почему использование памяти приложения всегда растет и никогда не падает ( "но он должен собирать мусор!" )
Ответ 6
Запутать "передать по ссылке" и "ссылочный тип":
void GetAnArray(int input, ref string[] output);
(Сравните с С++: void getAnArray(int input, std::vector<std::string>& output);
)
Ответ 7
- RAII vs IDispose
- тип значения vs ref type (struct vs class, boxing and unboxing и т.д.)
Ответ 8
Написание полного пространства имен каждый раз.
Это хорошо в С++, когда вы печатаете std::this
или boost::that
. Не так велико в С#, когда вы повторяете System.Windows.Forms.Whatever
повсюду.
Ответ 9
Кстати, компилятор С# имеет ряд эвристик в нем для помощи опытный программист на С++, который является новичком программистом на С#. Например, если вы скажете
int x[];
компилятор поможет указать, что [] является частью типа в С#, поэтому вы, вероятно, имели в виду
int[] x;
С# также допускает такие вещи, как помещение ненужных точек с запятой в конце объявления класса, чтобы программисты на С++, которые в этой привычке не укусили его.
Ответ 10
Забыть указать модификаторы доступа для каждого члена класса.
Ответ 11
Тот, кто меня достал, и я верю, что многие люди, не являющиеся С++, тоже теряют память из-за зарегистрированных событий, поддерживающих живой объект.
IDisposable grated для начала (и, тем не менее, если я честен), но, очевидно, будет иметь значение при переходе от родного к управляемому коду, поэтому я не ожидал, что разработчики С++ на самом деле, им это просто не понравится.
Ответ 12
Попытка реализовать правильность const
на string
s.
Ответ 13
используя венгерскую нотацию и другие соглашения об именах С++
private int m_iMyIntField;
class CWidget { ... }