当我只需要 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]
。不需要或不需要或不需要第二个维度。
如果您想删除对库的引用,还有一些其他建议:
new Int32[] {200, 300}
创建一个包含两个整数的一维数组,值为 200 和 300。您可以使用 array[0]
和 array[1]
访问它们。
- 正如 Ron Beyer 所建议的,您可以使用
Tuple<int, int>
。
- 创建您自己的
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
并删除设置器),但如果你依赖于你在问题中考虑的两个选项的可变性,那么这将需要更多改变你做事的方式。但实际上,不可变性才是解决之道。
我正在构建一个应用程序,让我可以从我的 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]
。不需要或不需要或不需要第二个维度。
如果您想删除对库的引用,还有一些其他建议:
new Int32[] {200, 300}
创建一个包含两个整数的一维数组,值为 200 和 300。您可以使用array[0]
和array[1]
访问它们。- 正如 Ron Beyer 所建议的,您可以使用
Tuple<int, int>
。 - 创建您自己的
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
并删除设置器),但如果你依赖于你在问题中考虑的两个选项的可变性,那么这将需要更多改变你做事的方式。但实际上,不可变性才是解决之道。