Подтвердить что ты не робот

Наиболее распространенные или порочные ошибки в разработке С# для опытных программистов на С++

Каковы наиболее распространенные или порочные ошибки, когда опытные программисты на С++ развиваются в С#?

4b9b3361

Ответ 1

  • разница между struct и class в двух
  • разница между алиасом using и a typedef
  • Когда мои объекты собираются? как я могу их уничтожить сейчас?
  • насколько велика 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 { ... }