在派生类的构造函数体中初始化基类成员变量
本文关键字:初始化 基类 成员 变量 函数体 派生 | 更新日期: 2023-09-27 18:16:34
我有一个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#代码中使用#定义,而是使用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;
};
p。有人告诉我c#
中的#定义"请注意:没有保证条件。解决方案中所有项目的编译符号都是相同的。这是否会阻碍其他解决方案重用您的dll条件编译符号。"
我决定转向枚举,因为我真的不明白这意味着什么。我对。net有点陌生
要在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中使用"add as link"将同一文件添加到两个或多个项目中),因此注释"be aware"不适用。如果有,请使用与c++代码相同的注意事项。
在你的c#代码中,变量Global。ConfigEnum在运行时计算,在我的c#代码中,就像在你的c++中一样,在编译时检查符号POSTER_VER ,导致编译的二进制文件不同。
参见MSDN上的#if, #define和ProjectProperties
如果dppBaseError
是一个字段,您可以像您在代码中所示的那样初始化它。
如果是基类构造函数,可以这样做:
dppServerError(uint ActionCode, string Desciption)
: base( (Globals.ConfigEnum == POSTER_VER) ? Desciption : "Smth else" + Desciption)
{
...