Rather than me banging on about changing your design, here is some more
practical advice.
IMHO, the proper way to think about classes (reference types) versus
structs (value types) in .NET is to think of _identity_. Consider the
following:
A customer is certainly something that has an identity. It corresponds
to a real-world thing (a person or business), and if you were to store
it in a database you would give it a UID.
An integer, on the other hand, has no identity. It has a value. One can
talk about "that integer there" versus "this integer here" only in the
sense that some additional semantic meaning is attached to the integer,
at which point it stops being just an integer and becomes a value with
meaning. "My salary" for example. My salary _could_ have a UID because
it's mine, not someone else's. The number 100000 does not have an
identity.
A polygon probably does have an identity. You might want to refer to a
specific polygon, and I can imagine storing a polygon somewhere and
giving it a UID. Two squares with the same coordinates are not the same
square, although they are the same size and at the same position. A
Point, on the other hand, is just a value. (5,10) means nothing out of
context. As such, you should think of it the same way you think about
an integer.
When you say that you want to create a reference type to hold a point,
what you're really saying is, "I want this point here to have an
identity different from that point there." However, what does that
really mean out of context? I maintain that it's the context to which
you want to assign an identity, not the point value itself. You want to
be able to say, "The 12th point of that polygon." (where "that polygon"
implies identity and thus a reference type). A point has identity only
within the context of a polygon.
So, points are values. Given a polygon, you can manipulate its points.
However--and here's the bottom line--you can't simply grab a point from
a polygon and pass it about your system, _and have that point remember
it was from that polygon_, and by manipulating that stand-alone point
manipulate it within the context of its polygon. That's a weird concept
anyway, don't you think: "Hey, I have this point, that belongs to some
polygon somewhere, and I'm going to change it." You really can't do
anything with the point unless you know what polygon it's in. As such,
you offer operations on _polygons_ or _points within polygons_, not on
points all by themselves, out of context.
I think that Point-as-value-type plays beautifully with what you want
to do, and Point-as-reference-type makes for a strange logical
framework in which you can have points floating about with independent
identities separate from their polygons.
Or maybe I just don't understand well enough what you want to do.
