Ich bin überrascht, dass ich bei keiner der bisherigen Antworten diesen, meiner Meinung nach wichtigsten Aspekt gelesen habe:
Ich verwende Structs, wenn ich einen Typ ohne Identität haben möchte. Zum Beispiel ein 3D-Punkt:
public struct ThreeDimensionalPoint
{
public readonly int X, Y, Z;
public ThreeDimensionalPoint(int x, int y, int z)
{
this.X = x;
this.Y = y;
this.Z = z;
}
public override string ToString()
{
return "(X=" + this.X + ", Y=" + this.Y + ", Z=" + this.Z + ")";
}
public override int GetHashCode()
{
return (this.X + 2) ^ (this.Y + 2) ^ (this.Z + 2);
}
public override bool Equals(object obj)
{
if (!(obj is ThreeDimensionalPoint))
return false;
ThreeDimensionalPoint other = (ThreeDimensionalPoint)obj;
return this == other;
}
public static bool operator ==(ThreeDimensionalPoint p1, ThreeDimensionalPoint p2)
{
return p1.X == p2.X && p1.Y == p2.Y && p1.Z == p2.Z;
}
public static bool operator !=(ThreeDimensionalPoint p1, ThreeDimensionalPoint p2)
{
return !(p1 == p2);
}
}
Wenn Sie zwei Instanzen dieser Struktur haben, ist es egal, ob es sich um ein einziges Datenstück im Speicher oder um zwei handelt. Sie interessieren sich nur für den Wert (die Werte), die sie enthalten.