在派生类的构造函数的主体中初始化基类成员变量

Initializing base class member variables in the body of derived class's constructor

本文关键字:基类 初始化 成员 变量 主体 派生 构造函数      更新时间:2023-10-16

我有一个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)
{
    ...