С точки зрения эффективности, лучше просто использовать свойства Width и Height, чтобы делать все, что вам нужно, где вы можете. Однако не забывайте правило оптимизации №1: не делайте этого .
Идея класса-обертки - хорошее решение, но я просто хотел выбросить идею глобально конвертируемой структуры. Я использую что-то вроде этого, чтобы избавиться от беспокойства о преобразованиях vector-> point и point-> vector (по крайней мере, во время отладки):
[DebuggerDisplay("{value}")]
public struct PointyVector
{
Vector2 value;
//Constructors:
public PointyVector(System.Drawing.Point point)
{
value = new Vector2(point.X, point.Y);
}
public PointyVector(Point point)
{
value = new Vector2(point.X, point.Y);
}
public PointyVector(Vector2 vector)
{
value = new Vector2(vector.X, vector.Y);
}
//Implicit conversion operators:
public static implicit operator PointyVector(Vector2 vector)
{
return new PointyVector(vector);
}
public static implicit operator PointyVector(System.Drawing.Point point)
{
return new PointyVector(point);
}
public static implicit operator PointyVector(Point point)
{
return new PointyVector(point);
}
public static implicit operator Vector2(PointyVector vector)
{
return vector.value;
}
public static implicit operator Point(PointyVector vector)
{
return new Point((int)vector.X, (int)vector.Y);
}
}
Эта структура, с добавлением нескольких бинарных операторов между Vector2 и Point, делает вещи вектор / точка в Xna намного проще, но она также может привести к неоднозначности приведения, ошибкам округления, потерям усечения и всему остальному веселью проблемы, связанные с числовыми преобразованиями. Все эти проблемы легко решаются с помощью явных приведений, но имейте в виду, что если вы видите «странные числа» при использовании этой структуры, это, вероятно, связано с потерей точности при преобразованиях.