.NET 让您在学习时更快上手,尤其是在使用可视界面构建表单时。这在一段时间内非常有吸引力,但根据我的经验,您最终会发现一些限制。
缺点:
1-要求客户端计算机上存在相应的 .NET 框架版本,这并不总是得到保证。
2- 3D 图形应用程序存在问题,已停止支持 .net directX。 (我认为 SlimX 引擎可以解决这个问题,但你还是有点卡住了)。
3-您的 3D 应用程序可能无法在较新版本的 Windows 上运行而无需返工,或者可能没有解决方法,请参阅 #2。 (我发现这很难)
我学习 Win32 已经有一段时间了,虽然入门比较困难,但感觉确实更强大、更精简。
缺点:
1-你必须在你的项目中处理头文件,这对于初学者来说需要一些时间来理解。由于编译器是“一次性”的,而且事情的顺序很重要,因此有一种非常具体的方式来处理这些。
2-win32 API 更严格,所有内容都在一个或多或少的通用命名空间中,大列表很麻烦。
3- 成员的自动完成显示上没有提示/说明,因此您必须花费数周时间查看所有不同成员的文档。
4-没有像 .NET 中那样的自动“回调”(即 On_button_click),您必须通过“wndproc”函数处理的“消息”来处理 Windows 元素。这需要一些时间来理解,尤其是如果您来自 .NET。再次,您必须翻阅大量文档来确定您需要哪些消息名称和参数。
这种范式本身不是问题,但它使您很难将您的实际应用程序与您的 Windows gui 设计分开。
5-再次,由于 Windows 元素通过“消息”进行通信,因此您无法获得与实际成员函数一样的合理或描述性自动完成选项
看到这个伪代码:
button.text="abc"; //在这种情况下,您了解可能的选项
对
SendMessage(button_hwnd, BN_SETTEXT, "abc", 0); //需要看MSDN/StackOverflow
6-不会自动取消分配对象内存。但我认为这还不算太糟糕。
c++ 类有一个 ~name() 析构函数,当实例被销毁时,您可以在其中释放事物。
我还尝试为在运行时实例化的成员使用动态数组,这有助于实际有序并处理实际的分配过程。
伪代码:
类游戏{
std::vector(ghost) 幽灵;
}
更新{
ghosts.pushback(); //加一个,等等
ghosts.erase(位置); //任何元素都可以被杀死。这个不错
}
~game(){ //
~鬼(); //释放数组
}
所以到目前为止我所看到的是,您只需要更加注意和结构化以防止内存泄漏,否则我不会让手动释放成为问题。
关于可移植性,我认为如果应用程序封装良好,那么移植到其他平台应该不会太难。依赖 .NET 框架是不值得的,具有讽刺意味的是,它本身就破坏了可移植性。
但是每个人的里程当然会有所不同。
但不管有什么缺点,到目前为止,我对 Win32 很满意,我已经投入了大约 2 个月的学习时间,并且我已经为 Windows 控件构建了自己的包装器,因此构建和与 Windows 交互更容易以编程方式形成。
我还在窗体上运行 irllicht 3D 引擎,它似乎可以在具有不同 Windows 版本的多台机器上完美运行。很高兴看到可执行文件在任何 (Windows) 机器上运行而无需依赖或安装。
程序加载速度更快,看起来更小。然而,在性能方面,我认为这些天 AFAIK 并没有太大的优势。
我认为微软应该为 API 编写一些简单的包装器,以及一些不错的示例和模板项目,而不是采用整个庞大的 .NET 路线。
只要我的 0.02 美元
编辑:我知道 MFC 封装了一些功能,但我读过它会增加一些开销,而且它并没有真正流行起来。希望有人可以补充这一点,因为我还没有真正玩过它。
哦,这里 [Is it worth to learn Microsoft Foundation Classes(MFC) Nowadays?