0

如果使用满足特定条件的参数调用构造函数并且我有以下代码,我将尝试以不同方式初始化构造函数。

class MessageEventArgs : EventArgs
{
    private int _pId;
    private string _message;
    private string _channelPath;

    public MessageEventArgs(string message)
    {
        _pId = Process.GetCurrentProcess().Id;
        _message = message;
        _channelPath = null;
    }

    public MessageEventArgs(string[] details)
    {
        if (details.Length == 1)
        {
            new MessageEventArgs(details[0]);
            return;
        }
        _pId = int.Parse(details[0]);
        _message = details[1];
        _channelPath = details[2];
    }
}

令人惊讶的是,在调试和逐行单步执行时,我看到所有东西都被正确调用了,但是在实例化之后,pId并且_message有它们的默认值,即 0 和 null

4

5 回答 5

9

您没有调用其他构造函数,而是创建了第二个实例,您使用默认值初始化该实例。

因此,第一个实例仍未初始化。

你需要这样做:

class MessageEventArgs : EventArgs
{
    private int _pId;
    private string _message;
    private string _channelPath;

    public MessageEventArgs(string message)
    {
        _pId = Process.GetCurrentProcess().Id;
        _message = message;
        _channelPath = null;
    }

    public MessageEventArgs(string[] details)
    {
        if (details.Length == 1)
        {
            _pId = Process.GetCurrentProcess().Id;
            _message = details[0];
            _channelPath = null;
            return;
        }
        _pId = int.Parse(details[0]);
        _message = details[1];
        _channelPath = details[2];
    }
}

我可能会检查细节是否null也是..

于 2013-10-03T15:08:18.997 回答
8

根据规范,在 C# 中,您不能从类中调用另一个构造函数。所以这不是 return 语句,而是调用另一个构造函数的不正确尝试。您必须创建一个Initialize体现您正在尝试做的事情的方法,并从这两种方法中调用它。

class MessageEventArgs : EventArgs
{
    private int _pId;
    private string _message;
    private string _channelPath;

    public MessageEventArgs(string message)
    {
        Initialize( message );
    }

    public MessageEventArgs(string[] details)
    {
        if (details.Length == 1)
        {
            Initialize( details[ 0 ] );
            return;
        }

        _pId = int.Parse(details[0]);
        _message = details[1];
        _channelPath = details[2];
    }

    private void Initialize(string message)
    {
        _pId = Process.GetCurrentProcess().Id;
        _message = message;
        _channelPath = null;     
    }
}
于 2013-10-03T15:10:55.570 回答
2

不确定这是否更清洁,但您可以尝试以下操作:

    public MessageEventArgs(string message)
        : this(new [] {message})
    {
    }

    public MessageEventArgs(string[] details)
    {
        if (details.Length == 1)
        {
            _pId = Process.GetCurrentProcess().Id;
            _message = details[0];
            _channelPath = null;
        }
        else
        {
            _pId = int.Parse(details[0]);
            _message = details[1];
            _channelPath = details[2];
        }
    }
于 2013-10-03T15:17:40.153 回答
1

您不能从构造函数返回任何内容。尝试这样的事情。

    if (details.Length == 1)
    {
        _pId = Process.GetCurrentProcess().Id;
         _message = message;
        _channelPath = null;
    }
    else 
    {
        _pId = int.Parse(details[0]);
        _message = details[1];
        _channelPath = details[2];
    }
于 2013-10-03T15:06:58.973 回答
1

您不能从构造函数调用同一类的构造函数。您的代码创建了 MessageEventArgs 的本地实例,它超出了范围,这就是您看不到预期行为的原因。

构造函数旨在根据传递的参数创建对象的实例。重载意味着允许传递不同的参数并导致对象的正确实例化。构造函数是原子的,因此如果您删除一个构造函数,它不会影响其他构造函数。

您的代码应如下所示:

class MessageEventArgs : EventArgs
{
    private int _pId;
    private string _message;
    private string _channelPath;

    public MessageEventArgs(string message)
    {
        _pId = Process.GetCurrentProcess().Id;
        _message = message;
        _channelPath = null;
    }

    public MessageEventArgs(string[] details)
    {
        if (details.Length == 1)
        {
            _pId = Process.GetCurrentProcess().Id;
            _message = details[0];
            _channelPath = null;
        }
        else 
        {
            _pId = int.Parse(details[0]);
            _message = details[1];
            _channelPath = details[2];
        }
    }
}
于 2013-10-03T15:21:30.047 回答