Поведение программистов Bad С++ в С#

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

Я долго программист на С++, который начнет работать над проектами С#.

Каковы некоторые концептуальные изменения, которые необходимо знать, и что самое главное, чего я должен избегать в С#, которые я обычно делал бы на С++? Какие вредные привычки программисты на С++ приносят на С#, которые они должны потерять?

У меня есть список книг С#, которые я намереваюсь читать. Я хотел бы увеличить это с помощью опыта других программистов, которые сделали этот же переход, потому что я, вероятно, сделаю те же ошибки, что и они; Я хотел бы предотвратить это до того, как это произойдет.

Ответы

Ответ 1

Только один пример:

В С++ нет разницы между структурой и классом. На протяжении многих лет это приводило к тому, что группы и отдельные лица определяли свои собственные правила использования друг друга.

В С# есть конкретная разница. Структура - это тип значения, а класс - ссылочный тип.

Когда программисты на С++ приносят на С# старые, произвольные определения класса/структуры, происходят неожиданные вещи.

Вот довольно хорошее чтение для программистов на С++, перемещающихся на С#: http://msdn.microsoft.com/en-us/magazine/cc301520.aspx

Ответ 2

Одна вещь, о которой нужно знать, это то, что С# не имеет деструкторов в том же смысле, что и С++. Метод с сигнатурой деструктора С++ называется финализатором в С# и не нужен (и в некоторых случаях не рекомендуется) для их реализации.

Ознакомьтесь с IDisposable и этими статьями по сборке мусора: Все думают о сборке мусора неправильным образом и Сбор мусора: автоматическое управление памятью в Microsoft.NET Framework.

Ответ 3

  • нет неявного RAII, вы должны явно его кодировать
  • нет защиты от const
  • свойствами являются пары методов, а не значение
  • при итерации вы начинаете перед сборкой и заканчиваете ее в конце (в терминах С++)
  • foreach - это как использовать const_iterator
  • Список, как сказано в названии, не является списком, является массивом
  • generics разрешаются во время компиляции, а не при их использовании.

Ответ 4

Хуже, у меня видно есть

1) чрезмерно использовать критический контекст (блокировка с помощью монитора или блокировки()) в веб-проекте! Результат довольно часто уменьшает IIS до более или менее однопоточной системы.

2) Слишком большая обработка строк. Используются для того, чтобы делать все сами, не полагаясь на рамки. Строки неизменны в С#, пока они не находятся на С++.

3) Использование небезопасного кода, потому что они могут и не потому, что должны.

4) Не доверяющий GC

Ответ 5

Большие:

  • С# не имеет множественного наследования, вместо этого он использует интерфейсы.
  • Вы не можете контролировать время жизни объект или использовать это в ваших интересах.
  • Оператор равенства С# не всегда делайте то, что считаете нужным. Иногда он сравнивает содержание переменная, а иногда и адрес переменной.

Ответ 6

Не так много, переход от С++ к С# - это своего рода деградация, поэтому вы не можете делать "плохие вещи". Единственное, о чем я могу думать, опирается на автоматическое управление памятью:

class A {
    ofstream file;
public:
    // bla bla
};

В С# вам нужно реализовать весь IDisposable мусор, чтобы не пропустить файл... Вы можете легко забыть его.

Поведение программистов Bad С# на С++ было бы более интересной темой.

Ответ 7

Там вы можете сделать на С++, что вы не можете сделать на С#, и наоборот. Они вряд ли вызовут у вас проблемы.

Самое большое изменение - избавление от мышления "инстанцирование - это инициализация". Сбор мусора означает, что вам не нужно беспокоиться о распределении или освобождении памяти (кроме случаев, когда вы это делаете), но это также означает, что вы не можете полагаться на то, что выпадает из области действия, запускающей деструктор для очистки после вас.

Изучите конструкцию "using" на С# и убедитесь, что вы ее используете.

Второе изменение - в С++ "class" и "struct" - синонимы. В С# они очень разные вещи.

Ответ 8

Это не "плохая" привычка, но что-то, что вам обязательно нужно иметь в виду при переключении с С++ на С#: полагаться на деструкторы для вашей очистки. Вместо этого вам нужно запомнить реализацию IDisposable и управлять временем жизни вашего объекта оператором using.

Ответ 9

Изменения при переходе с С++ на С#:

  • Использовать свойства, когда это возможно, для представления данных о членах класса
  • Использовать интерфейсы в ситуациях, которые могут вызвать множественное наследование в С++
  • Использовать события для уведомления вместо передачи функций обратного вызова (делегатов) классам
  • Не забудьте использовать конструкцию use() {}, чтобы обеспечить доступ к ресурсам, например файлам и соединениям DB, когда они выходят за пределы области видимости.

Это как раз у меня на голове

Ответ 10

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

Если вы чувствуете соблазн использовать/небезопасно, вы почти наверняка ошибаетесь.

Изучите библиотеку классов.