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

时间:2010-03-11 12:25:15

标签: c# c++

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

13 个答案:

答案 0 :(得分:26)

  • 两个
  • structclass之间的差异
  • using别名与typedef
  • 之间的差异
  • 何时收集我的物品?我如何销毁它们现在
  • int有多大? (它实际上是用C#定义的)
  • 我的链接器在哪里? (实际上,Mono在某些情况下确实有完整的AOT链接器)

答案 1 :(得分:13)

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

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

答案 2 :(得分:11)

致电GC.Collect

答案 3 :(得分:9)

  1. 始终使用结构支持类
  2. 始终使用输入,输出和参考参数(这是第1点的结果)。
  3. 使用 int值作为错误条件而不是使用例外
  4. 使用虚拟关键字代替覆盖关键字。
  5. 认为 char是8位有符号值

答案 4 :(得分:5)

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

或者:

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

答案 5 :(得分:5)

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

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

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

答案 6 :(得分:4)

  • RAII vs IDispose
  • value type vs ref type(struct vs class,boxing and unboxing等)

答案 7 :(得分:4)

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

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

答案 8 :(得分:4)

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

int x[];

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

int[] x;

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

答案 9 :(得分:3)

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

答案 10 :(得分:2)

尝试在const上实施string正确性。

答案 11 :(得分:2)

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

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

答案 12 :(得分:1)

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

private int m_iMyIntField;
class CWidget { ... }