Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Can object constructor return a null?

We have taken over some .NET 1.1 Windows Service code that spawns threads to read messages off a queue (SeeBeyond eGate JMS queue, but that is not important) and in turn spawns threads to process the message in the target application service. We are continually encountering logic and design decisions that is puzzling us to no end. Here is one example, where the message (lsMessage) has been retrieved from the queue and ready for processing

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;     } } 

Please ignore the use of label and goto for the moment; that is not the question. Our bewilderment is the check whether the Thread object is null right after instantiation. The else statement below seems to suggest the previous developers have encountered situations like this before. Of course, the original developers are long gone. So we would like to know, can the CLR really instantiate an object after the call to the constructor and return a null? We have no knowledge of such a possibility.

like image 582
icelava Avatar asked Jan 13 '09 08:01

icelava


People also ask

How do you return a null object in Java?

In Java, a null value can be assigned to an object reference of any type to indicate that it points to nothing. The compiler assigns null to any uninitialized static and instance members of reference type. In the absence of a constructor, the getArticles() and getName() methods will return a null reference.

Can a constructor return null C#?

The constructor cannot return value, But you can handle it differently. Nice, exactly what I needed! I was going to recommend this approach but the only thing I'd have to add is that this approach is called Factory Pattern .

Can a constructor return an object?

No, a constructor initialises an object that's already been created. It doesn't return an object.


2 Answers

In my opinion, what the else statement suggests is that the previous developers didn't know their C#. A constructor always returns a constructed object or throws an exception.

In the very old times, C++ constructors could return null, so maybe the problem comes from that. This is no longer true in C++ either, at least for the default new operator.

like image 101
Gorpik Avatar answered Sep 16 '22 15:09

Gorpik


Edit: for clarification there is an insane edge case where you can get null from a class constructor, but frankly I don't think any real code should ever expect to deal with this level of crazy: What's the strangest corner case you've seen in C# or .NET? . To all normal intents : it won't happen.


No, you can't get null from a class constructor (Thread is a class). The only case I know of where a constructor can (seem to) return null is Nullable<T> - i.e.

object foo = new int?(); // this is null 

This is a slightly bigger problem with generics:

static void Oops<T>() where T : new() {     T t = new T();     if (t == null) throw new InvalidOperationException(); }  static void Main() {     Oops<int?>(); } 

(of course, there are ways of checking/handling that scenario, such as : class)

Other than that, a constructor will always either return an object (or initialize a struct), or throw an exception.

like image 20
Marc Gravell Avatar answered Sep 20 '22 15:09

Marc Gravell