c# - Setting Objects to Null/Nothing after use in .NET

ID : 20179

viewed : 29

Tags : c#.netvb.netmemory-managementnullc#

Top 5 Answer for c# - Setting Objects to Null/Nothing after use in .NET

vote vote

91

Karl is absolutely correct, there is no need to set objects to null after use. If an object implements IDisposable, just make sure you call IDisposable.Dispose() when you're done with that object (wrapped in a try..finally, or, a using() block). But even if you don't remember to call Dispose(), the finaliser method on the object should be calling Dispose() for you.

I thought this was a good treatment:

Digging into IDisposable

and this

Understanding IDisposable

There isn't any point in trying to second guess the GC and its management strategies because it's self tuning and opaque. There was a good discussion about the inner workings with Jeffrey Richter on Dot Net Rocks here: Jeffrey Richter on the Windows Memory Model and Richters book CLR via C# chapter 20 has a great treatment:

vote vote

83

Another reason to avoid setting objects to null when you are done with them is that it can actually keep them alive for longer.

e.g.

void foo() {     var someType = new SomeType();     someType.DoSomething();     // someType is now eligible for garbage collection               // ... rest of method not using 'someType' ... } 

will allow the object referred by someType to be GC'd after the call to "DoSomething" but

void foo() {     var someType = new SomeType();     someType.DoSomething();     // someType is NOT eligible for garbage collection yet     // because that variable is used at the end of the method               // ... rest of method not using 'someType' ...     someType = null; } 

may sometimes keep the object alive until the end of the method. The JIT will usually optimized away the assignment to null, so both bits of code end up being the same.

vote vote

71

No don't null objects. You can check out https://web.archive.org/web/20160325050833/http://codebetter.com/karlseguin/2008/04/28/foundations-of-programming-pt-7-back-to-basics-memory/ for more information, but setting things to null won't do anything, except dirty your code.

vote vote

67

In general, there's no need to null objects after use, but in some cases I find it's a good practice.

If an object implements IDisposable and is stored in a field, I think it's good to null it, just to avoid using the disposed object. The bugs of the following sort can be painful:

this.myField.Dispose(); // ... at some later time this.myField.DoSomething(); 

It's good to null the field after disposing it, and get a NullPtrEx right at the line where the field is used again. Otherwise, you might run into some cryptic bug down the line (depending on exactly what DoSomething does).

vote vote

56

Chances are that your code is not structured tightly enough if you feel the need to null variables.

There are a number of ways to limit the scope of a variable:

As mentioned by Steve Tranby

using(SomeObject object = new SomeObject())  {   // do stuff with the object } // the object will be disposed of 

Similarly, you can simply use curly brackets:

{     // Declare the variable and use it     SomeObject object = new SomeObject() } // The variable is no longer available 

I find that using curly brackets without any "heading" to really clean out the code and help make it more understandable.

Top 3 video Explaining c# - Setting Objects to Null/Nothing after use in .NET

Related QUESTION?