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

Mat*_*ieu 19 c# c++

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

Mar*_*ell 26

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

  • int有多大.定义良好的语言和环境的乐趣:) (7认同)
  • 我觉得有必要指出C++将其定义为实现,以便编译器可以使用性能最高的本机类型,而不是受规范限制.如果您需要,可以使用大小类型. (6认同)

Spe*_*nce 13

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

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

  • 模板与泛型的+1 - 很好的捕捉. (6认同)

Pet*_*ter 11

打电话GC.Collect.


cod*_*nix 9

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

  • Re#3:"返回代码被认为有害"?对不起,但是如果你需要收集中间结果并且需要继续进行例外则是禁止的.枚举返回代码有它们的位置.尝试捕获以控制"常规"流程并不是最好的主意. (7认同)
  • 前三个听起来更像C程序员会犯的错误......或者可能是非常差的C++程序员. (3认同)

Tim*_*son 5

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

要么:

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

  • 好吧,在C++中,您确信一旦变量超出范围就会调用析构函数,因此通常不需要明确地处理资源(这是RAII的要点). (4认同)
  • .NET终结器与C++析构函数不同.如果清理代码不重要,那么您可以将其留给垃圾收集时间(完成).如果你确实需要确定性清理 - 比如关闭文件句柄 - 调用`IDisposable.Dispose`. (3认同)

Tim*_*son 5

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

void GetAnArray(int input, ref string[] output);
Run Code Online (Sandbox Code Playgroud)

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