对于有经验的C ++程序员来说,C#开发中最常见或最恶毒的错误

当有经验的C ++程序员在C#中开发时,最常见或最恶毒的错误是什么?

  • 两者中structclass的区别
  • using别名和typedef之间的区别
  • 什么时候收集我的物品? 我现在如何摧毁他们?
  • int多大? (它实际上是用C#定义的)
  • 我的链接器在哪里? (实际上,Mono在某些情况下确实有完整的AOT链接器)

我在C#中看到许多C ++编码器以COM风格编写代码,试图解决语言的不足之处。 C#为您的枚举提供了许多类型安全支持,并且通常有更好的API,然后P / Invback回到C ++。

我见过的另一件事是大多数人都认为C#generics不是模板。

调用GC.Collect

  1. 使用结构体一直支持类
  2. 始终使用in,out和ref参数(这是第1点的结果)。
  3. 使用int值作为错误条件而不是使用exception
  4. 使用virtual关键字而不是override关键字。
  5. 认为char是8位有符号值

认为“垃圾收集”=“我根本不必担心对象的生命周期”。 例如,打开FileStream并忘记关闭它。

要么:

  1. 分配很多对象
  2. 把它们放在一个大的全球字典中(通常在“我知道之后,我会制作缓存”)
  3. 想知道为什么应用程序的内存使用率总是上升而且从不下降(“但它应该是垃圾收集!”)

混淆“通过引用传递”和“引用类型”:

 void GetAnArray(int input, ref string[] output); 

(与C ++比较: void getAnArray(int input, std::vector& output);

  • RAII vs IDispose
  • 值类型vs ref类型(struct vs class,装箱和拆箱等)

每次都写入完整的命名空间。

当你输入std::thisboost::that时,这在C ++中很好。 当您重复System.Windows.Forms.Whatever时,在C#中不是那么好。 System.Windows.Forms.Whatever在。

顺便提一下,C#编译器中有许多启发式方法可以帮助经验丰富的C ++程序员,他们是新手C#程序员。 例如,如果你说

 int x[]; 

编译器将有助于指出[]是C#中类型的一部分,所以你可能意味着

 int[] x; 

C#还允许在类声明的末尾添加不必要的分号,这样那些习惯的C ++程序员就不会被它咬掉。

忘记为每个类成员指定访问修饰符。

试图在string s上实现const正确性。

得到我的一个,我相信很多非C ++人员,由于注册事件使对象保持活跃而泄露内存。

IDis可以接受开头(如果我是诚实的话,仍然会这样做)但是从原生代码到托管代码显然会有所不同,所以我不希望C ++开发人员真正犯规,他们只是不喜欢它。

使用匈牙利表示法和其他C ++命名约定

 private int m_iMyIntField; class CWidget { ... }