I am designing a class that will contain a somewhat too big number of DateTime fields. It will be convenient to use this set of fields separately in some functions. Also, the meaning and way of usage of this set - what I can describe as a "complex timestamp", fits value type semantics better than object semantics IMHO. So I think of uniting these fields in one structure. An important detail is that many of these fields can be null as by the business logic model semantics. I would also prefer if it and its members would not be ever passed outside the class by reference (though this is a subjective idea of mine, perhaps passing this by reference would do no harm ever actually).
For example (not exactly my case, but a seemingly relevant illustration)
public struct ProjectTaskDateTimeStamp
{
DateTime Drafted // I don't mind if this field is made nullable too perhaps
DateTime? Proposed
DateTime? Approved
DateTime? Finished
DateTime? Archived
}
I may also decide to make this-typed property of the class nullable too.
How bad/reasonable idea this is and why? Should I make this a class instead and why?
In what actual ways (including memory representation and management, behaviour of itself, its members and other language/runtime subjects that will be interacting with it and passing/sharing it among each other, language semantics) does a structure containing nullable fields (and assigned to a nullable variable perhaps) differ from a class and from a pure (containing value type fields only) structure?