c# 在C#中調用基礎構造函數
5
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;
}
}
c# constructor
如果我從一個基類繼承,並希望從繼承類的構造函數傳遞給基類的構造函數,我該怎麼做?
例如,
如果我從Exception類繼承我想要做這樣的事情:
class MyExceptionClass : Exception
{
public MyExceptionClass(string message, string extraInfo)
{
//This is where it's all falling apart
base(message);
}
}
基本上我想要的是能夠將字符串消息傳遞給基類Exception類。
1100 votes
c#
public class MyExceptionClass : Exception
{
public MyExceptionClass(string message,
Exception innerException): base(message, innerException)
{
//other stuff here
}
}
您可以將內部異常傳遞給其中一個構造函數。
c#1
1098
從框架設計指南和FxCop規則。 :
1.自定義異常的名稱應以Exception結尾
class MyException : Exception
2.例外應該是公開的
public class MyException : Exception
- 一個公共無參數的構造函數。
- 具有一個字符串參數的公共構造函數。
- 一個帶有一個字符串和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.
}
}
c#2
1097
class Exception
{
public Exception(string message)
{
[...]
}
}
class MyExceptionClass : Exception
{
public MyExceptionClass(string message, string extraInfo)
: base(message)
{
[...]
}
}
c#3
1096
根據此處列出的其他答案,您可以將參數傳遞到基類構造函數中。 建議在繼承類的構造函數的開頭調用基類構造函數。
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...
}
}
c#4
1095