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

时间:2015-10-08 11:58:40

标签: c# c++

我有一个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有点新鲜。

2 个答案:

答案 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