Advanced CSharp – unsafe mode

tp_vol4_006 One of the “advantages” of using CSharp instead of VB.NET is that if programmers want to, they have the option of bypassing the memory management of .NET and working with memory directly.  This is called “unsafe” mode.

While I will show you how to use this keyword, I have to tell you up front that I’ve been using CSharp since Beta 2 of .NET 1.0 and I’ve NEVER needed to switch into unsafe mode to do any of the work that I’ve done.

I’ve even written code that bridged down to some unmanaged C++ code and still have not needed to use unsafe mode.

One of the main advantages of using .NET to begin with is the fact that .NET manages our memory for us.  I’ve worked on far too many C++ programs that leaked memory due to their complexity and bad architecture to purposely go back to that model.

Yes, it is true that you might get a slight performance improvement by bypassing the memory management and working with the memory directly.  But is that slight improvement worth the risk of all of the issues that arise when using memory directly?

If you find that you need to use unsafe mode, I would recommend that you consider writing that part of your code in a language that was designed for that level of coding.  Assembler or C++ are some good choices.

If these are not options, here’s where the unsafe keyword comes in.

Any code you wrap in the unsafe keyword:

unsafe
{
    // this code is unmanaged
}

becomes unmanaged.  You will also need to add the /unsafe compiler switch to your compiler options.

You can also make an entire method unsafe by adding the keyword to the method declaration:

public unsafe void Foo(int *i)
{
    // i is a pointer that is unsafe
}

In a future post, we’ll look at some ways of using pointers in CSharp code.

Related Post

  • Stackalloc in CSharpStackalloc in CSharp In the last few weeks we've looked at several keywords from the CSharp language that allow us to deal with memory management directly.  Stackalloc is another keyword from that list. Before we l...
  • Dispose, Finalize and SuppressFinalizeDispose, Finalize and SuppressFinalize I got the following question recently. What is the difference between Dispose and SupressFinalize in garbage collection?” The problem with this question is it assumes Dispose and SupressFina...
  • Using VB.NET From CSharpUsing VB.NET From CSharp Back when I was teaching .NET to other programmers regularly, I would frequently get the following question from a VB6 programmer moving to CSharp. “Is there any way of using some of the VB funct...
  • Making values nullableMaking values nullable First, a little history lesson. When .NET was first released, we had value types and object types.  The difference between the two is that you do not have to set aside memory for a value type b...
  • Delegates in .NETDelegates in .NET I received the following question: What is a delegate?  What problem does it solve?  and When might I use a delegate? A delegate is essentially a function pointer.  We have used function poi...