Click here to Skip to main content
13,248,927 members (43,305 online)
Click here to Skip to main content
Add your own
alternative version

Tagged as


2 bookmarked
Posted 29 Sep 2011

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

, 30 Sep 2011
Rate this:
Please Sign up or sign in to vote.
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);
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>>()


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


About the Author

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.

You may also be interested in...


Comments and Discussions

GeneralWhat is the advantage of your solution in opposite to just m... Pin
Klaus Luedenscheidt30-Sep-11 19:28
memberKlaus Luedenscheidt30-Sep-11 19:28 
GeneralRe: You can't save a reference passed as a ref parameter for lat... Pin
BobJanova1-Oct-11 1:39
memberBobJanova1-Oct-11 1:39 

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.

Permalink | Advertise | Privacy | Terms of Use | Mobile
Web01 | 2.8.171114.1 | Last Updated 30 Sep 2011
Article Copyright 2011 by BobJanova
Everything else Copyright © CodeProject, 1999-2017
Layout: fixed | fluid