Question: I am creating a geometry library in C# and I will need the following *immutable* types:

* `Vector2f` (2 `float`s - 8 bytes)
* `Vector2d` (2 `double`s - 16 bytes)
* `Vector3f` (3 `float`s - 12 bytes)
* `Vector3d` (3 `double`s - 24 bytes)
* `Vector4f` (4 `float`s - 16 bytes)
* `Vector4d` (4 `double`s - 32 bytes)

I am trying to determine whether to make them structs or classes. [MSDN](http://msdn.microsoft.com/en-us/library/ms229017.aspx) suggests only using a struct if the size if going to be no greater than 16 bytes. That reference seems to be from 2005. Is 16 bytes still the max suggested size?

I am sure that using structs for the `float` vectors would be more efficient than using a class, but what should I do about the `double` vectors? Should I make them structs also to be consistent, or should I make them classes?

**Updated:**
Looks like the everyone agrees they should be structs. Thanks for the great answers.

Answer: 
We recently switched some maths types (vec3, vec4, matrices etc.) over to use structs instead of classes and, as well as being slightly quicker in benchmarks, it also reduced the GC pressure (we had hundreds of megabytes of Vec3 allocations over a relatively short period of time, discovered via the CLR profiler).

It's interesting to note that the Xna implementation of Vectors & Matrices is done using structs. You can always pass by reference where appropriate if you're concerned about performance, too.
Structs are (usually) stored on the stack, which *might* make them more efficient, but probably not enough to make a noticeable difference.

<http://www.c-sharpcorner.com/UploadFile/rmcochran/csharp_memory01122006130034PM/csharp_memory.aspx?ArticleID=9adb0e3c-b3f6-40b5-98b5-413b6d348b91>