这真的取决于您想要开发的应用程序的种类。对于大多数目的而言,C#和.NET是完全适合的。但是,有某些需要尽可能少的依赖项的应用程序(例如shell扩展),这些应用程序不适合作为.NET应用程序来实现。对于这些应用程序,您需要使用Win32。
无论您是否在大部分工作中使用.NET,始终有必要至少基本了解Win32。
我完全同意Joel Spolsky在他众多精彩文章中所写的内容。我认为了解机器的底层不仅可以编写高质量的代码,而且可以解决必然出现的问题。
因此,是的,至少了解WIN32 API的基础知识非常重要,即使不深入了解,也至少要知道它存在于你将编写的所有代码的基础之上。
如果你正在Windows上编写C#代码,这是非常相关的。并不是所有Win32的功能都通过.Net库暴露出来。我在这里描述了WM_SETREDRAW消息技术的一个具体示例:WM_SETREDRAW。在其他时候,这也是控件焦点问题所需的。
此外,了解Win32和Windows的工作原理将使您更好地理解C#/.Net的各个方面,例如:
话虽如此,WPF改变了所有这些,如果您只编写.Net 3 / 3.5代码,则我的论点失去了部分相关性。
在我看来,不需要。我很久以前就学过了,所以你不必学。
我认为你先学习C是很好的选择,现在也可以偶尔编写C程序,但我不认为深入研究win32 API有什么用处。老实说,那个东西相当混乱。
我认为学习基础知识非常重要。如果你只学会了显示带有一些字段、一些按钮和菜单的窗口,或者在一个单独的窗口中画一些东西,那么这将帮助你学习Windows真正的工作原理的基础知识。我相信理解消息循环以及几乎所有你看到的东西都是一个窗口的实现,这些都是每个人都应该知道的基本事情。当我第一次意识到按钮本身就是一个窗口时,我的眼睛真的被打开了。然后它帮助你理解,通过发送这些窗口消息可以打开和关闭事物的功能。子类化窗口可以让你访问.NET或VB Classic等工具中没有暴露给你的功能,并增强窗口的功能。
正如AlexDrenea所提到的,一定要学习基础知识。虽然.NET可以帮助你屏蔽很多Win32 API调用,但是Win32 API是如此庞大,你肯定会遇到.NET没有为你封装的情况。
一个真实的常见情况是在ListViewColumns上显示排序箭头
我不认为学习Win32 API对任何人来说都是现实的。这些API(是的,不止一个)非常庞大,你几乎永远不需要详细了解它们的全部内容。我建议您先了解一些基础知识(例如窗口创建、窗口消息、窗口过程,可能还有一些GDI等),然后在需要时使用MSDN查找其他信息。
除非你需要某些不在.NET Framework中的功能(比如获取打印机驱动程序的详细信息),否则不需要。这大约是你将要做的工作中的99%(当然,这只是我随意编造的一个任意值)。
即使你正在使用Win32而不是.NET,真的有必要学习书中的同样深度吗?浏览一下章节,了解一下如果将来遇到问题时应该去哪里查找。然后就可以停止了。有空闲时间或需要时再深入研究。
我认为这个问题已经有答案了,但是如果你进行.NET 2.0开发或任何.NET中的winforms开发,你肯定会遇到许多问题,因为某些部分的框架包装了win32和mfc,你需要深入研究才能使其按预期工作。