我正在使用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);
答案 0 :(得分:3)
您可以简单地重载+
运算符 - 如下所示:
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。
答案 1 :(得分:1)
添加到单独的班级。
public static void Add(this Point a, Point b){
a.X += b.X;
a.Y += b.Y;
}
答案 2 :(得分:1)
您可以将大小结构添加到 Point 结构中,并通过将Point传递给Size构造函数,轻松地在它们之间进行转换:
c = a + (new Size(b));
为什么DOT NET选择强化强化和广泛元组之间的这种微妙区别是超出我的。
答案 3 :(得分:1)
您可以使用扩展程序方法,如下所示
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);
}
}
答案 4 :(得分:1)
从技术上讲,您可以使用静态方法,扩展方法,甚至可能使用运算符重载,正如其他答案所示。
但是,.NET同时具有Point
和Size
来捕获语义区别:
Point
指的是一个点,通常与任意参考点进行比较。Size
指向量 - 距离与方向或距离X&距离Y。添加Point
s将毫无意义。例如,如果Point
指的是地理地图上的坐标 - 它们的含义是什么? “50°纬度”+“60°纬度”=“110°纬度”?这就是.NET明智地选择不实现加法运算符的原因。
但是,添加Point
和Size
可以有合理的含义 - “50°纬度”+“1°纬度距离”=“纬度51°”是一个很好的答案。
PS。请注意与DateTime
和TimeSpan
之间区别的相似性。
TL; DR - 您Point
中的一个或两个实际上应该是Size
- 尽可能在最早的位置进行更改。