For ease of use value should be treated as a ulong. You then write a helper method to access the ValueLow and ValueHigh sections of it.
Here's an example
Code:
public uint DataLow
{
get { return (uint)Data; }
set { Data = (ulong)((DataHigh << 32) | value); }
}
public uint DataHigh
{
get { return (uint)(Data >> 32); }
set { Data = (ulong)((value << 32) | DataLow); }
}
This is useful because often you DO want the full ulong (status effects) wheras other times you need separate values