当我只需要 x,y 坐标时,我应该使用 Int32[] 还是 System.Drawing.Point?

Should I use Int32[,] or System.Drawing.Point when all I want is the x,y coordinates?

我正在构建一个应用程序,让我可以从我的 PC 控制我的 Android 设备。 运行 太棒了,所以现在我想开始清理我的代码以便发布。我正在尝试清理不需要的解决方案引用,因此我查看了用于实现 Point class 的 using System.Drawing;。问题是,如果我切换到使用二维 Int32 数组,我真的不需要它。

所以我可以:new Int32[,] {{200, 300}}; 而不是 new Point(200, 300); 并完全摆脱 System.Drawing 命名空间。问题是:这真的重要吗?我是否真的通过保留 System.Drawing 命名空间在我的应用程序中引入了膨胀? Int32[,] 更轻便吗?

或者,我是否应该不使用任何一个而只跟踪单个 Int32 变量中的 x、y 坐标?

编辑:我摆脱了我写的最初想法:Int32[200, 300]并将其替换为new Int32[,] {{200, 300}};,因为正如@Martin Mulder指出的那样Int32[200, 300] "creates a two-dimensional array with 60000 integers, all of them are 0."

EDIT2:所以我很笨。首先,我试图通过使用多维数组来幻想太多。彻头彻尾的愚蠢。其次,我接受了使用 struct 的建议,并且一切正常,所以感谢前四个答案;他们每个人都是正确的。但是,毕竟,我无法最终删除 System.Drawing 引用,因为我正在开发一个 WinForms 应用程序,并且 System.Drawing 在应用程序的设计器中被广泛使用!我想我可以进一步重构它,但我将大小减小到 13KB,所以它已经足够好了。谢谢大家!

仅通过引用库,您的应用程序中没有任何内容 "embedded"。但是,如果 Point class 确实是您所需要的,您可以删除引用并实现您自己的 Point 结构。这可能比 int 数组更直观。

顺便说一句,

Int32[,] 是不同的东西。它是一个二维数组,而不是一对两个 int 值。使用它会使事情变得更糟。

可以使用Tuple<int, int>,但我会创建您自己的结构。


正如一些人在此处建议的实施方式。所以只要把你的两个整数包起来,我就用这个:

public class MyPoint
{
    public int X;
    public int Y;
} 

仅在需要时添加所有其他功能。

你的建议非常不明智:.

  • new Point(200, 300) 用两个整数创建一个新点:X 和 Y 属性 的值为 200 和 300。

  • new Int32[200,300]创建一个二维数组,有60000个整数,全部为0。

  • (编辑后)new Int32[,] {{200, 300}} 还创建了一个二维数组,这次有 2 个整数。要检索第一个值 (200),您可以像这样访问它:array[0,0] 和第二个值 (300),如 array[0,1]。不需要或不需要或不需要第二个维度。

如果您想删除对库的引用,还有一些其他建议:

  1. new Int32[] {200, 300} 创建一个包含两个整数的一维数组,值为 200 和 300。您可以使用 array[0]array[1] 访问它们。
  2. 正如 Ron Beyer 所建议的,您可以使用 Tuple<int, int>
  3. 创建您自己的 Point-struct(由 Jon Hanna 指出)。它使您的应用程序更大一些,但是您阻止了引用并且阻止了库 System.Drawing 被加载到内存中。

如果我想删除该引用,我会选择最后一个选项,因为它更清楚我在做什么(Point 比 Int32 数组或 Tuple 更具可读性)。解决方案 2 和 3 比解决方案 1 稍快。

正如@Glorin Oakenfoot 所说,您应该实施自己的观点 class。这是一个例子:

public class MyPoint // Give it a unique name to avoid collisions
{
   public int X { get; set; }
   public int Y { get; set; }
   public MyPoint() {} // Default constructor allows you to use object initialization.
   public MyPoint(int x, int y) { X = x, Y = y }
}

只需创建您自己的:

public struct Point : IEquatable<Point>
{
  private int _x;
  private int _y;
  public int X
  {
    get { return _x; }
    set { _x = value; }
  }
  public int Y
  {
    get { return _y; }
    set { _y = value; }
  }
  public Point(int x, int y)
  {
    _x = x;
    _y = y;
  }
  public bool Equals(Point other)
  {
    return X == other.X && Y == other.Y;
  }
  public override bool Equals(object other)
  {
    return other is Point && Equals((Point)other);
  }
  public int GetHashCode()
  {
    return unchecked(X * 1021 + Y);
  }
}

更好的是,让它不可变(使字段 readonly 并删除设置器),但如果你依赖于你在问题中考虑的两个选项的可变性,那么这将需要更多改变你做事的方式。但实际上,不可变性才是解决之道。