在.NET中是否存在UI无关的Point结构?

33

我了解几个.NET中的Point结构体: System.Drawing.Point, System.Windows.Point, Sys.UI.Point,但它们都在高级UI库(GDI+, WPF, AJAX)中。我需要一个不依赖于任何特定UI技术的Point结构体,用于我的类库计算。是否有任何独立于UI的Point结构体在.NET中?或者我需要自己创建?这很简单,我知道,但听起来像是重新发明轮子。


14
如果一个类型有某种含义或更广泛的用途,而不仅仅是在方法中快速返回多个项,我几乎总是会投票反对使用TupleTuple本身没有意义。 - Adam Houldsworth
1
在.NET中,类通常在需要的地方定义,就像你找到它们的地方所示。 我想不到在BCL的其他地方可以使用具有XY属性的Point类或结构的任何实现,显然.NET团队也没有。 - CodeCaster
1
你正在处理空间数据吗?你可以使用空间数据类型,或者创建一个类似于SharpMap的Point类的点类。 - Habib
你最终采用了什么解决方案? - tofutim
哈哈,我正在尝试进行PCL跨平台开发 - 最终使用了Splat库。 - tofutim
显示剩余4条评论
5个回答

19
据我所知,目前没有这样的东西,但正如你所说,自己实现并不难,所以我建议你自己动手实现。
你可能会被建议使用 Tuple 类,但是虽然它可以完成任务,但你不希望一遍又一遍地重复使用它。此外,根据你应用程序的具体情况,你可能会遇到比较问题。

7
重新发明轮子,它会更加顺畅!如果只是一个小型结构体,为什么要依赖于大型程序集,拉入许多其他东西呢?特别是在像手机这样的受限设备上...但是请注意如何正确使用类和结构体,如果您想获得最佳性能。
这是一篇非常好的文章,我感觉你非常渴望阅读它:Frank Savage on CLR performance

2
您也可以使用 Tuple 类来实现此目的。

3
请注意,这是一个类而不是结构体,并且是不可变的,而不是可变的。使用“元组”也会删除有关类型的所有信息;您将不再拥有有意义的类型名称或其属性。 - Servy
1
@Servy,确实它是一个不可变类,而不是结构体,在大多数情况下这是一件好事(我之前进行了性能基准测试)。它并不会失去类型信息,因为它是一个泛型类。 - Grzenio
5
在特定情况下,一个类或结构体哪个更好取决于具体的上下文环境。但大多数你找到的 Point 类都是结构体是有原因的。通常情况下,它们的使用场景倾向于从结构体中受益,虽然并非在所有情况下都是这样,但这种差异仍然很重要。至于失去类型信息,你确实会失去它。当我看到一个 Tuple<int, int> 时,我不知道它代表坐标系中的哪个点。当我看到一个 Point 类时,我清楚它所表示的是哪个点。对于 Tuple,我看不出哪个属性代表哪个维度,我只需要知道它即可,等等。 - Servy
1
@Servy 是正确的。Tuple 类的属性被命名为 Item1、Item2、ItemN(...)。并不像 Point.X/Y 或 Coordinate.Latitude/Longitude/Altitude 那样清晰明了。 - Crono
@Crono1981,我明白了!确实如此。 - Grzenio

1

您可能希望使用System.Drawing.PointSystem.Drawing.PointF。是的,它可以转换为适当的GDI+结构并从中转换,但本身它只是一个.NET结构体。它是纯托管结构体,而且恰好是COM可见和可转换的 :)


@StevenDoggart 从我的角度来看,System.Drawing 几乎在任何情况下都会存在,即使在 Mono 中也是如此,所以为什么不使用它呢?它并不自动要求你使用 GDI+ 或其他任何东西。而且它是一个相当不错的基准“标准” Point。 - Luaan
假设我(或其他人)想要创建一个使用我的库中具有点类型参数的函数的WPF应用程序。那么我将不得不将WPF Point转换为GDI+ Point,这对我来说似乎非常不自然,因为在UI和我的库中都没有其他用途使用GDI+。将其转换为特定于我的库的Point似乎更合乎逻辑。 - Aleksey Shubin
@AlekseyShubin 是的,但是无论你使用WPF的Point还是GDI+'s的PointF,你都必须进行类型转换。而且我们讨论的是一个只有两个简单字段的结构体,真的很重要吗? - Luaan
@Luaan 如果该类型也用于非 UI 应用层,例如服务或业务规则,则这很重要。 - Crono
3
我完全理解你的观点,但我仍然认为,如果没有更重要的原因,强制依赖这个程序集是一个错误。请记住,System.Drawing不支持可移植类库项目。因此,如果需要在多个平台上部署该程序集,这种依赖关系将成为一个问题。虽然这种情况很少发生,但对我来说足以考虑创建自己的结构体。 - Crono
显示剩余4条评论

0

如果您不想创建自己的Point类,可以考虑使用TupleMSDN链接。您可以传递任何类型的坐标对给您的类库,而不是强制用户实例化一个新类。

但是,如果您想为库的使用者提供几个辅助方法,我建议创建自己的类。元组非常适合快速传递数据。


1
是的,如果没有其他解决方案,我肯定会更喜欢创建自己的Point而不是使用Tuple。 - Aleksey Shubin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接