What is value semantics?
Structs are value types (Section 4.1) and are said to have value semantics. Classes, on the other hand, are reference types (Section 4.2) and are said to have reference semantics.
A variable of a struct type directly contains the data of the struct, whereas a variable of a class type contains a reference to the data, the latter known as an object.
With classes, it is possible for two variables to reference the same object, and thus possible for operations on one variable to affect the object referenced by the other variable. With structs, the variables each have their own copy of the data (except in the case of ref and out parameter variables), and it is not possible for operations on one to affect the other. Furthermore, because structs are not reference types, it is not possible for values of a struct type to be null.
Given the declaration
struct Point { public int x, y; public Point(int x, int y) { this.x = x; this.y = y; } }
the code fragment
Point a = new Point(10, 10); Point b = a; a.x = 100; System.Console.WriteLine(b.x);
outputs the value 10. The assignment of a to b creates a copy of the value, and b is thus unaffected by the assignment to a.x. Had Point instead been declared as a class, the output would be 100 because a and b would reference the same object.