我们使用了一些.NET 1.1WindowsService代码,该代码生成线程以从队列中读取消息(SeeBeyond eGate JMS队列,但这并不重要),然后生成线程来处理目标应用程序服务中的消息。我们不断地遇到逻辑和设计上的决定,这使我们无法自圆其说。下面是一个示例,其中消息(lsMessage)已从队列中检索并准备好处理
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吗?我们对这种可能性一无所知。
发布于 2009-01-13 08:39:11
在我看来,else声明所暗示的是,以前的开发人员不知道他们的C#。构造函数总是返回构造的对象或抛出异常。
在很久以前,C++构造函数可以返回null,所以问题可能来自于此。这在C++中也不再适用,至少对于默认的new操作符是这样的。
发布于 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> --即
object foo = new int?(); // this is null这是泛型的一个稍微大一些的问题:
static void Oops<T>() where T : new() {
T t = new T();
if (t == null) throw new InvalidOperationException();
}
static void Main() {
Oops<int?>();
}(当然,有检查/处理该场景的方法,如: class)
除此之外,构造函数总是返回一个对象(或初始化一个结构),或者抛出一个异常。
发布于 2009-01-13 08:41:10
不是的!空检查是多余的。很多搬到C#的C#开发人员都有一个空检查的习惯,我想这里也是一样的。
唯一的问题是,您应该检查文档,看看构造函数是否可以抛出任何异常。在您的例子中,请参考http://msdn.microsoft.com/en-us/library/xx3ezzs2.aspx,正如前面提到的,构造函数将始终返回有效的obj。
https://stackoverflow.com/questions/438325
复制相似问题