C# – a Value Class and what is a reference Class in C#

cnetoopterminology

What is the definition of a value class and reference class in C#?

How does this differ from a value type and reference type?

I ask this question because I read this in the MCTS Self-Paced Training Kit (Exam 70-536). Chapter 1, Lesson 1, Lesson review 4 :

You need to create a simple class or
structure that contains only value
types. You must create the class or
structure so that it runs as
efficiently as possible. You must be
able to pass the class or structure to
a procedure without concern that the
procedure will modify it. Which of the
following should you create?

A reference class

B reference structure

C value class

D value structure

Correct Answer: D

A Incorrect: You could create a
reference class; however, it could be
modified when passed to a procedure.

B Incorrect: You cannot create a
reference structure.

C Incorrect: You could create a value
class; however, structures tend to be
more efficient.

D Correct: Value structures are
typically the most efficient.

Best Answer

You may be thinking of C++/CLI which, unlike C#, allows the user to declare a "value class" or a "ref class." In C#, any class you declare will implicitly be a reference class - only built-in types, structs, and enums have value semantics. To read about value class in C++/CLI, look here: http://www.ddj.com/cpp/184401955

Value classes have very little functionality compared to ref classes, and are useful for "plain old data"; that is, data which has no identity. Since you're copying the data when you assign one to another, the system provides you with a default (and mandatory) copy constructor which simply copies the data over to the other object.

To convert a value class into a reference class (thereby putting it on the garbage-collected heap) you can "box" it.

To decide whether a class you are writing is one or the other, ask yourself whether it has an identity. That usually means that it has some state, or has an identifier or a name, or a notion of its own context (for example a node pointing to nearby nodes).

If it doesn't, it's probably a value class.

In C#, however, value classes are declared as "structs".