我如何在C#中“包含”定义?

时间:2016-05-26 15:30:00

标签: c# .net windows-7

我是一名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_DEFAULTLOGON32_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#中如何完成它。如果我必须手动复制粘贴这些值,这似乎很容易出错。在上面,它不会完全理解输入这些定义的人所做的艰苦工作!

2 个答案:

答案 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#代码。 这将减少人类复制价值的麻烦/错误的可能性。

可能有一些工具已经可以提供这些功能,但由于我不需要与太多的非托管代码进行交互,所以我尚未搜索一个。