Inntil nylig var jeg ikke klar over at C# har struct slik som C/C++.
Av en eller annen grunn har ikke dette blitt nevnt i tidligere bøker jeg har brukt, eller så har jeg bare ikke fått det med meg.
Derfor er det på høy tid å endelig komme i gang:
struct Mattevektor { public int X { get { return x; } } private int x; public int Y { get { return y; } } private int y; public Mattevektor(int x, int y) { this.x = x; this.y = y; } public static Mattevektor operator +(Mattevektor v1, Mattevektor v2) { return new Mattevektor(v1.x + v2.x, v1.y + v2.y); } public static Mattevektor operator -(Mattevektor v1, Mattevektor v2) { return new Mattevektor(v1.x - v2.x, v1.y - v2.y); } public static Mattevektor operator *(Mattevektor v1, int d) { return new Mattevektor(v1.x*d, v1.y*d); } public static bool operator ==(Mattevektor v1, Mattevektor v2) { return v1.x == v2.x && v1.y == v2.y; } public static bool operator !=(Mattevektor v1, Mattevektor v2) { return !(v1 == v2); } override public bool Equals(Object po) { Mattevektor p = (Mattevektor) po; return x == p.x && y == p.y; } public override int GetHashCode() { return int.Parse( x+""+y ); } override public string ToString() { return "(" + x + "," + y + ")"; } }
Her har jeg lagd en struct som kan holde en matematisk vektor. Den har støtte for diverse matematiske operasjoner, samt forskjellig sammenligningsoperatorer.
En test for å se hvordan dette fungerer i praksis:
static void Main(string[] args) { Mattevektor mattevektor1 = new Mattevektor(1, 1); Mattevektor mattevektor2 = new Mattevektor(2, 2); Console.WriteLine("mattevektor1.X = " + mattevektor1.X); Console.WriteLine("mattevektor1.Y = " + mattevektor1.Y); Console.WriteLine("mattevektor1 = " + mattevektor1); Console.WriteLine("mattevektor2 = " + mattevektor2); Console.WriteLine("mattevektor1 + mattevektor2 = " + (mattevektor1 + mattevektor2)); Console.WriteLine("mattevektor2 - mattevektor1 = " + (mattevektor2 - mattevektor1)); Console.WriteLine("mattevektor1 * 2 = " + (mattevektor1 * 2)); Console.WriteLine("mattevektor1 == mattevektor2: " + (mattevektor1 == mattevektor2)); Console.WriteLine("mattevektor1 != mattevektor2: " + (mattevektor1 != mattevektor2)); Console.ReadLine(); }
.. hvor resultatet blir som følger:
Bruk av struct passer best når denne representerer kun èn logisk verdi. Når størrelsen på en instans av denne typen er mindre enn 16 bytes. Når innholdet ikke kan endres. Og når man ikke har som vane å ofte gjøre om verdien til å bli et objekt (kalt «boxing») som da lagres i det dynamiske minnet.