Click here to Skip to main content
15,887,267 members
Articles / Programming Languages / C#
Tip/Trick

Boxing a value type in .NET to make it a reference type

Rate me:
Please Sign up or sign in to vote.
5.00/5 (3 votes)
30 Sep 2011CPOL 14.5K   2   4
How to wrap a value type so it can be used in positions where a reference type is required
Sometimes, you want to pass or store data which is in a value type in a context where only a reference type makes sense. This is either because you want to be able to modify the value from another location (as in this question[^]), or because you want to pass it as a type parameter to a generic class or method which has a where T: class (or where T: new()) restriction.

You can write a boxing class which can be used in such scenarios:
public class Box<T> where T:struct {
 public T Value { get; set; }

 public Box() : this(default(T)) {} // so it can be created from new()
 public Box(T value) { this.Value = value; }
 
 public static implicit operator T(Box<T> box) { return box.Value; }
 public static implicit operator Box<T>(T value) { return new Box<T>(value); }
}


Usage: If you want to use it as a 'pointer', you need to store the reference and pass it explicitly:
Box<int> refint = 5;
ModifyingClass instance = new ModifyingClass(refint);
instance.Adjust();
Debug.Assert(6 == refint);

// where
class ModifyingClass {
 Box<int> target;
 public ModifyingClass(Box<int> i) { target = i; }
 public void Adjust() { target.Value++; }
}


To pass it as a prototype to a generic class, simply do
SomeRestrictedGeneric<Box<T>> variable = new SomeRestrictedGeneric<Box<T>>()

License

This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)


Written By
United Kingdom United Kingdom
I'm a recent graduate (MSci) from the University of Cambridge, no longer studying Geology. Programming is a hobby so I get to write all the cool things and not all the boring things Smile | :) . However I now have a job in which I have to do a bit of work with a computer too.

Comments and Discussions

 
GeneralWhat is the advantage of your solution in opposite to just m... Pin
Klaus Luedenscheidt30-Sep-11 18:28
Klaus Luedenscheidt30-Sep-11 18:28 
GeneralRe: You can't save a reference passed as a ref parameter for lat... Pin
BobJanova1-Oct-11 0:39
BobJanova1-Oct-11 0:39 
You can't save a reference passed as a ref parameter for later. So the constructor could change it, but it couldn't store the reference and have other methods change it. That is, ModifyingClass can't declare 'ref int target' in the instance scope.
GeneralReason for my vote of 5 Excellent explanation from the stand... Pin
Sergey Alexandrovich Kryukov29-Sep-11 19:22
mvaSergey Alexandrovich Kryukov29-Sep-11 19:22 
GeneralRe: Some poorly written generic containers have a class or new()... Pin
BobJanova30-Sep-11 2:34
BobJanova30-Sep-11 2:34 

General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Praise Praise    Rant Rant    Admin Admin   

Use Ctrl+Left/Right to switch messages, Ctrl+Up/Down to switch threads, Ctrl+Shift+Left/Right to switch pages.