c# - 如果我将这个序列作为参数传递,我应该检查序列长度吗?

标签 c# constructor initialization

我正在实现一个名为 Position 的结构, 表示包含属性 double Latitude, Longitude, Elevation 的地理位置.

它的构造函数之一是

public Position(double lat, double lon, double elev)

我创建了另一个这样的:

public Position(IEnumerable<double> coords) : this(
    coords.ElementAt(0),
    coords.ElementAt(1),
    coords.ElementAt(2)
) {}

这是有效的,但我可以通过 IEnumerable 似乎有些“错误”任何长度超过 3,所以我的问题是:

  1. 我应该检查 coords 的长度吗?并且只有在 coords.Count == 3 时才接受?
  2. 我应该使用 IEnumerable<double> 以外的序列类型吗? ?
  3. 我是否应该完全忘记将序列作为参数传递,为什么?

最佳答案

  1. 是的,您应该检查长度并在错误时抛出异常(可能是 ArgumentException),因为这显然是一种异常情况。

  2. 没有任何类型的长度是类型签名的一部分。但是,您应该使用 IList 以保证顺序(与 IEnumerable 不同),并且您可以按索引访问。

  3. 正是出于您描述的原因,您应该忘记作为 IEnumerable 传递。它只是一个不必要的潜在错误源,而且它使您的签名描述性降低,从而使您的代码可读性降低。如果您可以在编译时防止错误,为什么要放弃它?

    但是,您可以考虑创建一个 Coordinates 类,它只包含 LatitudeLongitudeElevation 参数。如果您需要执行诸如变换到不同坐标系之类的操作,这在以后也可能有用。

关于c# - 如果我将这个序列作为参数传递,我应该检查序列长度吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24253690/

相关文章:

c# - C# 中类似 JavaScript 的动态属性

java - 如果初始化对象涉及检查异常处理,如何使用枚举创建单例

c++ - 如何 "track"缺少 ctor 初始化列表参数?

c# - 无法监视 Azure 中的自定义性能计数器

c# - 根据用户参数动态判断依赖关系

Java:构建器模式与逻辑分组对象

c++ - 创建一个 const shared_ptr<pure virtual class> 成员

c# - 在 C# 中初始化静态变量内联或静态构造函数的区别

c++ - 如何在声明时将对象插入到 std::map 中

c# - 从Azure Mobile Windows Phone 8.1上传文件