Каковы наиболее распространенные или порочные ошибки, когда опытные программисты на C++ разрабатывают в C#?
struct
и класс
в двух с использованием псевдонима
и typedef
int
? (на самом деле он определен в C #) Думая, что "сборка мусора" = "Я никогда не нужно вообще беспокоиться о времени жизни объекта ". Например, открыть FileStream
и забыть закрыть его.
Или:
, используя Венгерская нотация и другие соглашения об именах C ++
private int m_iMyIntField;
class CWidget { ... }
Между прочим, компилятор C # имеет ряд эвристик для помощи опытному программисту C ++, который является начинающим программистом C #. Например, если вы скажете
int x[];
, компилятор поможет указать, что [] является частью типа в C #, поэтому вы, вероятно, имели в виду
int[] x;
C # также позволяет такие вещи, как размещение ненужных точек с запятой в конце объявления класса так что программисты на C ++, которые имеют такую привычку, не укусили это.
Каждый раз записывает полное пространство имен.
Это нормально в C ++, когда вы набираете std :: this
или boost :: that
. Не так хорошо в C #, когда вы повсюду повторяете System.Windows.Forms.Whatever
.
Один, который меня поразил, и я думаю, что у многих людей, не относящихся к C ++, происходила утечка памяти из-за зарегистрированных событий, поддерживающих объект в живых.
IDisposable с самого начала не понравился (и до сих пор, если честно), но совершенно очевидно, что это будет разница при переходе от нативного к управляемому коду, поэтому я не ожидал, что разработчики C ++ на самом деле столкнутся с , им это просто не понравится.
Путаница "передача по ссылке" и "ссылочный тип":
void GetAnArray(int input, ref string[] output);
(Сравните с C ++: void getAnArray (int input, std :: vector
)
Забыть указать модификаторы доступа для каждого члена класса.
Я видел, как многие программисты C ++ кодируют в стиле COM на C #, пытаясь справиться с недостатками языка. C # предоставляет много типобезопасной поддержки для ваших перечислений, и обычно есть более приятные API, чем P / Invoking обратно в C ++.
Другая вещь, которую я заметил, уловила большинство людей, - это то, что обобщенные шаблоны C # не являются шаблонами.