[C#] 在C#中調用基礎構造函數


Answers

請注意,您可以在對基礎構造函數的調用中使用靜態方法。

class MyExceptionClass : Exception
{
     public MyExceptionClass(string message, string extraInfo) : 
         base(ModifyMessage(message, extraInfo))
     {
     }

     private static string ModifyMessage(string message, string extraInfo)
     {
         Trace.WriteLine("message was " + message);
         return message.ToLowerInvariant() + Environment.NewLine + extraInfo;
     }
}
Question

如果我從一個基類繼承,並希望從繼承類的構造函數傳遞給基類的構造函數,我該怎麼做?

例如,

如果我從Exception類繼承我想要做這樣的事情:

class MyExceptionClass : Exception
{
     public MyExceptionClass(string message, string extraInfo)
     {
         //This is where it's all falling apart
         base(message);
     }
}

基本上我想要的是能夠將字符串消息傳遞給基類Exception類。




框架設計指南和FxCop規則。

1.自定義異常的名稱應以Exception結尾

    class MyException : Exception

2.例外應該是公開的

    public class MyException : Exception

3. CA1032:異常應該實現標準的構造函數。

  • 一個公共無參數的構造函數。
  • 具有一個字符串參數的公共構造函數。
  • 一個帶有一個字符串和Exception的公共構造函數(因為它可以包裝另一個Exception)。
  • 一個序列化構造函數在類型不密封的情況下受到保護,如果類型是密封的,則構造函數受保護 基於MSDN

    [Serializable()]
    public class MyException : Exception
    {
      public MyException()
      {
         // Add any type-specific logic, and supply the default message.
      }
    
      public MyException(string message): base(message) 
      {
         // Add any type-specific logic.
      }
      public MyException(string message, Exception innerException): 
         base (message, innerException)
      {
         // Add any type-specific logic for inner exceptions.
      }
      protected MyException(SerializationInfo info, 
         StreamingContext context) : base(info, context)
      {
         // Implement type-specific serialization constructor logic.
      }
    }  
    

要么

    [Serializable()]
    public sealed class MyException : Exception
    {
      public MyException()
      {
         // Add any type-specific logic, and supply the default message.
      }

      public MyException(string message): base(message) 
      {
         // Add any type-specific logic.
      }
      public MyException(string message, Exception innerException): 
         base (message, innerException)
      {
         // Add any type-specific logic for inner exceptions.
      }
      private MyException(SerializationInfo info, 
         StreamingContext context) : base(info, context)
      {
         // Implement type-specific serialization constructor logic.
      }
    }  



根據此處列出的其他答案,您可以將參數傳遞到基類構造函數中。 建議在繼承類的構造函數的開頭調用基類構造函數。

public class MyException : Exception
{
    public MyException(string message, string extraInfo) : base(message)
    {
        this.Message = $"{message} Extra info: {extraInfo}";
        // You can omit the 'this.' portion above...
    }
}

我注意到,在你的例子中,你從來沒有使用過extraInfo參數,所以我認為你可能想要將extraInfo字符串參數連接到異常的Message屬性(這看起來在接受的答案中忽略了這一點)你的問題)。

這可以通過調用基類構造函數,然後使用額外的信息更新Message屬性來實現。

或者,由於Message屬性是從基類繼承的,所以您甚至不必顯式調用基類構造函數。 您可以直接從繼承類的構造函數更新Message屬性,如下所示:

public class MyException : Exception
{
    public MyException(string message, string extraInfo)
    {
        this.Message = $"{message} Extra info: {extraInfo}";
        // You can omit the 'this.' portion above...
    }
}



public class MyExceptionClass : Exception
{
    public MyExceptionClass(string message,
      Exception innerException): base(message, innerException)
    {
        //other stuff here
    }
}

您可以將內部異常傳遞給其中一個構造函數。




class Exception
{
     public Exception(string message)
     {
         [...]
     }
}

class MyExceptionClass : Exception
{
     public MyExceptionClass(string message, string extraInfo)
     : base(message)
     {
         [...]
     }
}