1

我正在使用 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);
4

5 回答 5

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上找到。

于 2013-04-20T08:38:38.327 回答
1

添加到单独的类。

public static void Add(this Point a, Point b){
     a.X += b.X;
     a.Y += b.Y;
}
于 2013-04-20T05:39:55.883 回答
1

您可以将Size结构添加到Point struct ,并通过将 Point 传递给 Size 构造函数轻松地在它们之间进行转换,如下所示:

c = a + (new Size(b));

为什么 DOT NET 选择在密集元组和扩展元组之间实施这种微妙的区别,这超出了我的理解。

于 2013-04-20T05:40:36.123 回答
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);
    }
}  
于 2013-04-20T06:14:33.610 回答
1

从技术上讲,您可以使用静态方法、扩展方法,甚至可能是运算符重载,正如其他答案所暗示的那样。

但是,.NET 同时具有PointSize来捕捉语义上的区别:

  • Point指一个点,通常与任意参考点进行比较。
  • Size指的是向量 - 有方向的距离,或距离 X 和距离 Y。

添加Points 将毫无意义。例如,如果Points 指的是地理地图上的坐标——它们的含义是什么?“50°纬度”+“60°纬度”=“110°纬度”?这就是.NET 明智地选择不实现加法运算符的原因。

但是,添加PointSize可以具有合理的含义-“50°纬度”+“1°纬度距离”=“51°纬度”是一个很好的答案。

PS。DateTime注意与和之间的区别的相似性TimeSpan

TL;DR - 你的一个或两个Points 实际上应该是 a Size- 在最早的位置更改它。

于 2013-04-20T08:30:48.830 回答