Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/160.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从C++;到C# 我是一个C++程序员,进入C++程序。我用这种语言工作了一个月,理解了很多概念 当从C++到C语言时,我可能会遇到什么惊喜?有人警告我,析构函数没有按我的意图执行。最近,我尝试用泛型做一些事情,用T作为基类。那没用。我还有另一个问题,但我会把这归咎于在C#方面缺乏经验。我也很惊讶我的应用程序正在消耗内存,然后我发现我需要在一个函数中使用.dispose。(我以为它会像一个智能指针一样干净)_C#_C++_Language Comparisons - Fatal编程技术网

从C++;到C# 我是一个C++程序员,进入C++程序。我用这种语言工作了一个月,理解了很多概念 当从C++到C语言时,我可能会遇到什么惊喜?有人警告我,析构函数没有按我的意图执行。最近,我尝试用泛型做一些事情,用T作为基类。那没用。我还有另一个问题,但我会把这归咎于在C#方面缺乏经验。我也很惊讶我的应用程序正在消耗内存,然后我发现我需要在一个函数中使用.dispose。(我以为它会像一个智能指针一样干净)

从C++;到C# 我是一个C++程序员,进入C++程序。我用这种语言工作了一个月,理解了很多概念 当从C++到C语言时,我可能会遇到什么惊喜?有人警告我,析构函数没有按我的意图执行。最近,我尝试用泛型做一些事情,用T作为基类。那没用。我还有另一个问题,但我会把这归咎于在C#方面缺乏经验。我也很惊讶我的应用程序正在消耗内存,然后我发现我需要在一个函数中使用.dispose。(我以为它会像一个智能指针一样干净),c#,c++,language-comparisons,C#,C++,Language Comparisons,还有什么会让我感到惊讶 请不要抨击语言。我怀疑任何人都不会,但以防万一……我想你已经涵盖了主要内容。您应该仔细阅读垃圾收集,理解为什么没有析构函数,找出模式(哪种类型的析构函数替代了析构函数)。我想那是个大问题 我要说的另一件事是警告你,C#和.Net基类库相当大,要充分利用它,还有很多东西需要学习。。。一旦您了解了垃圾收集的基本知识和类型系统,您将希望了解LINQ,并且您应该花时间探索您所在领域的相关库/框架(例如WPF、WCF、ASP.Net等)。但一切都很好。我从C++移到C++,永远不会

还有什么会让我感到惊讶


请不要抨击语言。我怀疑任何人都不会,但以防万一……

我想你已经涵盖了主要内容。您应该仔细阅读垃圾收集,理解为什么没有析构函数,找出模式(哪种类型的析构函数替代了析构函数)。我想那是个大问题


我要说的另一件事是警告你,C#和.Net基类库相当大,要充分利用它,还有很多东西需要学习。。。一旦您了解了垃圾收集的基本知识和类型系统,您将希望了解LINQ,并且您应该花时间探索您所在领域的相关库/框架(例如WPF、WCF、ASP.Net等)。但一切都很好。我从C++移到C++,永远不会返回,我发现它更有效率(我不是抨击C++,我仍然是:)- < /p> 对象模型中的差异。例如,值和引用类型是按定义分开的,而不是按它们的实例化方式分开的。这有一些惊喜,例如

myWinForm.Size.Width = 100;

不会更改宽度,您需要创建一个新的大小实例并分配它。

幸运的是,Microsoft在此处提供了一些信息:


<> >结构与类的差异是C++起源的另一个重要原因。

几个月前我做了同样的改变(在我已经改变java之前,但我并没有花很多时间编程java)。 以下是我遇到的一些最大的陷阱:

属性vs.变量vs.Setter

我遇到的最大陷阱之一是知道是否必须更改属性、设置变量或使用setter来设置类的某些方面

IList vs.List vs.其他系列

了解IList、List和所有其他集合之间的区别(在我看来,使用IList真的做不了多少事情)

泛型确实有自己的缺陷

如果你打算使用大量泛型,也许阅读本文可以帮助你避免我的一些错误:


但总的来说,我会说这种变化非常顺利。

好吧,语言完全不同,我相信你已经意识到,如果你曾经使用过C。在C++中,你没有强大的宏或模板(我意识到C中有泛型),就像C++一样。至于记忆,记住你不再处于一个严格控制的环境中。在任务管理器和类似工具中可能会看到大量内存使用,这是正常的。有更好、更细粒度的性能计数器来查看真正的内存使用情况。此外,您可能不需要像您所想的那样调用dispose(顺便说一句,如果您还没有使用“using”块,请查看)

另一个明显的例子是默认构造函数,在C#中,这不会创建新的Foo对象:

Foo myFoo;
你不能有任何类似“void指针”的东西,除非你把它看作是一个object类型的引用。同样,你需要把属性看作是语法糖,而不是公共成员,因为它们用C++语法来看待。 确保您理解“out”和“ref”参数


显然,这不是一个很大的列表,只是几个“指针”(没有双关语的意思)。

这是一个相当大的话题。一些想法:

C#是垃圾收集的。并不意味着你可以停止关注资源分配,但一般来说,你不必担心最常见的资源:内存

在C#中,一切都是一个对象。没有“原始”数据类型,甚至int也是一个对象

C#有泛型,而不是模板。模板比C#类似的语法泛型更丰富、更复杂,但泛型仍然提供了模板的几乎所有实用功能,没有很多麻烦

<强> C有接口和单继承。在C++中可以查看多重继承,而不是使用接口或不同的设计模式(例如策略)。

C#具有委托而不是函数指针。委托基本上只是一个类型化的函数指针。委托和委托关系(lambda表达式、事件、谓词等)的使用非常强大,值得投入大量精力进行研究


C#支持收益率回报。这是C#做事方式的基础。对某个集合进行迭代的最常见形式是使用foreach。理解枚举和迭代器是如何工作的是值得的。

< p>一些我没有看到的东西,在C++中是不可用的,可能有点令人惊讶,并且


这样的属性不会让你完全成熟。但是,它们确实允许你以一种与你在C++中解决它们的方式非常不同的方式来解决一堆问题。p> 好吧,那也不会编译。。。编译器会发现这种类型的错误。此外,您只需设置myWinForm.Width-P