我是一名C ++程序员,刚刚开始使用.NET在C#中编写Windows应用程序。
我正在查看MSDN上的一些示例代码(https://msdn.microsoft.com/en-us/library/chf6fbt4.aspx),我看到以下(部分)代码:
const int LOGON32_PROVIDER_DEFAULT = 0;
//This parameter causes LogonUser to create a primary token.
const int LOGON32_LOGON_INTERACTIVE = 2;
// Call LogonUser to obtain a handle to an access token.
bool returnValue = LogonUser(userName, domainName, Console.ReadLine(),
LOGON32_LOGON_INTERACTIVE, LOGON32_PROVIDER_DEFAULT, out safeTokenHandle);
因此,变量LOGON32_PROVIDER_DEFAULT
和LOGON32_LOGON_INTERACTIVE
在示例代码中明确定义。相反,如果我用C ++编写这个,我可以包含Winbase.h,它已经定义了这些变量:
#define LOGON32_LOGON_INTERACTIVE 2
#define LOGON32_LOGON_NETWORK 3
#define LOGON32_LOGON_BATCH 4
#define LOGON32_LOGON_SERVICE 5
#define LOGON32_LOGON_UNLOCK 7
有没有办法在C#中做同样的事情?那么,是否有一些魔法使我能够使用LOGON32_LOGON_INTERACTIVE
而无需在C#代码中自己定义它?我不是说重用标题,而是在c#中如何完成它。如果我必须手动复制粘贴这些值,这似乎很容易出错。在上面,它不会完全理解输入这些定义的人所做的艰苦工作!
答案 0 :(得分:3)
以同样的方式,C ++尝试使你的代码更多,比如说,分类比C代码,有类而不是函数(在C的情况下,你会尝试按照惯例分组,使用相同的长前缀),C#强迫自己对代码进行分类,以避免更多你刚才为C ++等价物描述的“全局项目”练习。
因此,你想在C#中使用常量?好的,只需将它放在一个类中,然后从需要它的其他代码中使用Class.MY_CONSTANT。
在这种特殊情况下,似乎有几个常量引用相同的“域”,所以闻起来就像我的枚举成员。学习C#枚举,它们非常有用,并且允许您拥有比C ++等效更多的succint代码。
答案 1 :(得分:2)
据我所知,你不能直接在C#中使用C ++标题。
此外,我更希望使用Enum
来存储这些值。
如果您愿意花一些时间学习这些C#功能,那么可以做的是使用CodeDom / T4 Templates从C ++标头生成C#代码。 这将减少人类复制价值的麻烦/错误的可能性。
可能有一些工具已经可以提供这些功能,但由于我不需要与太多的非托管代码进行交互,所以我尚未搜索一个。