我正在使用 C# XNA,当我尝试将两点相加时发现它不会让我这样做。有什么方法可以添加到 Point 类中以允许此代码运行。
Point a = new Point(3,4);
Point b = new Point(6,2);
Point c = a + b; //Should equal new Point(9,6);
我正在使用 C# XNA,当我尝试将两点相加时发现它不会让我这样做。有什么方法可以添加到 Point 类中以允许此代码运行。
Point a = new Point(3,4);
Point b = new Point(6,2);
Point c = a + b; //Should equal new Point(9,6);
您可以简单地重载+
运算符 - 如下所示:
class Point
{
public int X { get; private set; }
public int Y { get; private set; }
public Point(int x, int y)
{
X = x;
Y = y;
}
public static Point operator +(Point p1, Point p2)
{
return new Point(p1.X + p2.X, p1.Y + p2.Y);
}
}
现在,您的代码可以按照您的预期进行编译:
Point a = new Point(3, 4);
Point b = new Point(6, 2);
Point c = a + b; //Should equal new Point(9,6); - and it is :)
有关运算符重载的更多信息可以在MSDN上找到。
添加到单独的类。
public static void Add(this Point a, Point b){
a.X += b.X;
a.Y += b.Y;
}
您可以将Size结构添加到Point struct ,并通过将 Point 传递给 Size 构造函数轻松地在它们之间进行转换,如下所示:
c = a + (new Size(b));
为什么 DOT NET 选择在密集元组和扩展元组之间实施这种微妙的区别,这超出了我的理解。
您可以使用如下所示的扩展方法
class Program
{
static void Main(string[] args)
{
Point a = new Point(1, 2);
Point b = new Point(2, 4);
Point c=a.AddPoints(b);
}
}
public static class MyExtensions
{
public static Point AddPoints(this Point x, Point y)
{
return new Point(x.X + y.X, x.Y + y.Y);
}
}
从技术上讲,您可以使用静态方法、扩展方法,甚至可能是运算符重载,正如其他答案所暗示的那样。
但是,.NET 同时具有Point
和Size
来捕捉语义上的区别:
Point
指一个点,通常与任意参考点进行比较。Size
指的是向量 - 有方向的距离,或距离 X 和距离 Y。添加Point
s 将毫无意义。例如,如果Point
s 指的是地理地图上的坐标——它们的含义是什么?“50°纬度”+“60°纬度”=“110°纬度”?这就是.NET 明智地选择不实现加法运算符的原因。
但是,添加Point
和Size
可以具有合理的含义-“50°纬度”+“1°纬度距离”=“51°纬度”是一个很好的答案。
PS。DateTime
注意与和之间的区别的相似性TimeSpan
。
TL;DR - 你的一个或两个Point
s 实际上应该是 a Size
- 在最早的位置更改它。