对于有经验的C ++程序员来说,C#开发中最常见或最恶毒的错误
当有经验的C ++程序员在C#中开发时,最常见或最恶毒的错误是什么?
- 两者中
struct
和class
的区别 -
using
别名和typedef
之间的区别 - 什么时候收集我的物品? 我现在如何摧毁他们?
-
int
多大? (它实际上是用C#定义的) - 我的链接器在哪里? (实际上,Mono在某些情况下确实有完整的AOT链接器)
我在C#中看到许多C ++编码器以COM风格编写代码,试图解决语言的不足之处。 C#为您的枚举提供了许多类型安全支持,并且通常有更好的API,然后P / Invback回到C ++。
我见过的另一件事是大多数人都认为C#generics不是模板。
调用GC.Collect
。
- 使用结构体一直支持类 。
- 始终使用in,out和ref参数(这是第1点的结果)。
- 使用int值作为错误条件而不是使用exception
- 使用virtual关键字而不是override关键字。
- 认为char是8位有符号值 。
认为“垃圾收集”=“我根本不必担心对象的生命周期”。 例如,打开FileStream
并忘记关闭它。
要么:
- 分配很多对象
- 把它们放在一个大的全球字典中(通常在“我知道之后,我会制作缓存”)
- 想知道为什么应用程序的内存使用率总是上升而且从不下降(“但它应该是垃圾收集!”)
混淆“通过引用传递”和“引用类型”:
void GetAnArray(int input, ref string[] output);
(与C ++比较: void getAnArray(int input, std::vector
)
- RAII vs IDispose
- 值类型vs ref类型(struct vs class,装箱和拆箱等)
每次都写入完整的命名空间。
当你输入std::this
或boost::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 { ... }