我有一个C ++代码,我需要重写为C#,看起来像这样:
class dppServerError: public dppBaseError
{
public :
dppServerError(DWORD ActionCode, const TCHAR* Desciption)
#ifdef POSTER_VER
: dppBaseError(Desciption)
#else
: dppBaseError(TEXT("Server text response: \"%s\""), Desciption)
#endif
, m_AC(ActionCode), m_ErrorCode(dppERR_SERVER)
{
};
问题是我没有在我的C#代码中使用#defines而是使用public const Enums
。现在,我如何在C#中复制上面的代码? #ifdefs部分?
通常 通常在派生类的构造函数体中初始化基类的成员变量吗? (没有:语法)。然后我可以做(在C#中):
dppServerError(uint ActionCode, string Desciption)
{
// Initialize base class member
if(Globals.ConfigEnum == POSTER_VER)
dppBaseError = Desciption; // Can I initialize this base class ivar like this? without : syntax?
else
dppBaseError = "Smth else" + Desciption;
// These are just ivars from This class
m_AC = ActionCode;
m_ErrorCode = dppERR_SERVER;
};
PS。有人告诉我关于C#中的#defines
"但请注意:不保证有条件的 编译符号对于解决方案中的所有项目都是相同的。这个 将阻碍其他想要不同的解决方案重用您的DLL 条件编译符号。"
我决定转向枚举,因为我并没有真正理解这意味着什么。我对.NET有点新鲜。
答案 0 :(得分:0)
如果dppBaseError
是一个字段,您可以按照代码中的显示对其进行初始化。
如果它是基类构造函数,您可以这样做:
dppServerError(uint ActionCode, string Desciption)
: base( (Globals.ConfigEnum == POSTER_VER) ? Desciption : "Smth else" + Desciption)
{
...
答案 1 :(得分:0)
要在c#中获得相同的c ++行为,请使用:
#if POSTER_VER
dppBaseError = Desciption;
#else
dppBaseError = "Smth else" + Desciption;
#endif
或者:
dppServerError(uint ActionCode, string Desciption)
#if POSTER_VER
:base(Desciption)
#else
:base("Smth else" + Desciption)
#endif
使用#define POSTER_VER
指令,或者更好的是,在项目属性中定义符号 - >构建 - >条件编译符号。
通常,源文件仅包含在一个项目中(除非您使用"添加为链接"在visual studio中将相同的文件添加到两个或更多项目中),所以备注"是意识到"不适用。如果是这样,请使用与c ++代码相同的注意事项。
在你的c#代码中,变量Global.ConfigEnum在运行时被评估为,在我的c#代码中,就像你的c ++一样,符号POSTER_VER在complile时被检查 ,导致不同的编译二进制文件。
在MSDN上查看#if,#define和ProjectProperties