首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >对象构造函数可以返回null吗?

对象构造函数可以返回null吗?
EN

Stack Overflow用户
提问于 2009-01-13 08:31:20
回答 5查看 30.9K关注 0票数 39

我们使用了一些.NET 1.1WindowsService代码,该代码生成线程以从队列中读取消息(SeeBeyond eGate JMS队列,但这并不重要),然后生成线程来处理目标应用程序服务中的消息。我们不断地遇到逻辑和设计上的决定,这使我们无法自圆其说。下面是一个示例,其中消息(lsMessage)已从队列中检索并准备好处理

代码语言:javascript
运行
复制
if(lsMessage != null)
{
    // Initialize a new thread class instance, pass in message
    WorkerThread worker = new WorkerThread(lsMessage);

Process:
    // Start a new thread to process the message
    Thread targetWorker = new Thread(new ThreadStart(worker.ProcessMessage));
    if(targetWorker != null)
    {
        targetWorker.Priority = ThreadPriority.Highest;
        targetWorker.Name = "Worker " + queueKey.ToString();
        targetWorker.Start();

        // wait for worker thread to join back in specified period
        bool isFinished = targetWorker.Join(SYNC_THREAD_TIMEOUT);

        string message = worker.replyMsg;

        if ( !isFinished )  // BF is timeout
        {
            targetWorker.Abort();

            // [obscure developer name] 25/10/2004: calling Join() to wait for thread to terminate.
            // for EAI listener threads problem, ensure no new thread is started 
            // before the old one ends
            targetWorker.Join();

            // prepare reply message
            string errorMsg = string.Format("EAIMsg {0}: BF is timeout. Send sync message back to caller.", worker.messageKey);
            log.Debug(errorMsg);

            message = worker.GenErrorCode(message, errorMsg);
        }

        // Commit message
        MQ.ReceiverCommit(queueKey, worker.messageKey, false);

        // Send back the response to the caller
        MQ.RespondSend(queueKey, message); 
    } 
    else 
    {
        log.Debug(string.Format("Fail to start worker thread to process sync message. Thread returned is null. Sleep for {0} milliseconds.", LIMIT_RESOURCE_SLEEP));
        Thread.Sleep(LIMIT_RESOURCE_SLEEP);
        goto Process;
    }
}

请暂时忽略标签和后藤的使用,这不是问题。我们的困惑是检查线程对象在实例化之后是否为null。下面的else语句似乎表明,以前的开发人员以前也遇到过类似的情况。当然,原来的开发人员早就不在了。所以我们想知道,CLR真的能在调用构造函数之后实例化一个对象并返回一个null吗?我们对这种可能性一无所知。

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2009-01-13 08:39:11

在我看来,else声明所暗示的是,以前的开发人员不知道他们的C#。构造函数总是返回构造的对象或抛出异常。

在很久以前,C++构造函数可以返回null,所以问题可能来自于此。这在C++中也不再适用,至少对于默认的new操作符是这样的。

票数 43
EN

Stack Overflow用户

发布于 2009-01-13 08:36:36

编辑:为了澄清,有一种疯狂的边缘情况,您可以从类构造器获得null,但坦率地说,我认为任何真正的代码都不应该期望处理这个级别的疯狂:What's the strangest corner case you've seen in C# or .NET?。对所有正常人来说,这是不可能的。

不,不能从构造函数获得null (Thread是类)。我知道构造函数可以(似乎)返回null的唯一情况是Nullable<T> --即

代码语言:javascript
运行
复制
object foo = new int?(); // this is null

这是泛型的一个稍微大一些的问题:

代码语言:javascript
运行
复制
static void Oops<T>() where T : new() {
    T t = new T();
    if (t == null) throw new InvalidOperationException();
}

static void Main() {
    Oops<int?>();
}

(当然,有检查/处理该场景的方法,如: class)

除此之外,构造函数总是返回一个对象(或初始化一个结构),或者抛出一个异常。

票数 31
EN

Stack Overflow用户

发布于 2009-01-13 08:41:10

不是的!空检查是多余的。很多搬到C#的C#开发人员都有一个空检查的习惯,我想这里也是一样的。

唯一的问题是,您应该检查文档,看看构造函数是否可以抛出任何异常。在您的例子中,请参考http://msdn.microsoft.com/en-us/library/xx3ezzs2.aspx,正如前面提到的,构造函数将始终返回有效的obj。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/438325

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档