Value types and reference types are the two main categories of C# types. A variable of a value type contains an instance of the type (it contains directly its data). This differs from a variable of a reference type, which contains a reference to an instance of the type (it stores a reference to its data).
With reference types, two variables can reference the same object; therefore, operations on one variable can affect the object referenced by the other variable.
With value types, each variable has its own copy of the data, and it’s not possible for operations on one variable to affect the other (except in the case of in, ref, and out parameter variables; see in, ref, and out parameter modifier).
Here is a visualisation of variable passed to a method by reference and one passed by value. When passed by value, a new instance of the variable is created (from Penjee’s blog):
See: