对象的任何优势.GetObject(i)over objects [i]?

cor*_*ori 6 .net c# collections properties accessor

我正在重构前一个开发人员的一些C#数据访问代码,并对他使用的模式感到好奇.

该代码最初暴露了各种ActiveRecord样式业务对象的集合(数组) - 实质上是包装数据库字段的对象.我正在将数组更改为通用列表,但我很好奇的代码方面是前一个开发人员为他正在包装的每种类型的对象都有Get方法,因此:

public Thing GetThing(int i) {
    return things[i];
}
Run Code Online (Sandbox Code Playgroud)

有几种这样的方法,我不能为我的生活想到使用该机制而不是直接简单地引用事物[i]的任何可能的优势.为了论证,我们假设事物是公共财产,而不是公共领域(在这种情况下,它实际上是一个自动实现的属性,因此假设实际上是正确的).

我错过了一些明显的东西吗 甚至是一些深奥的东西?

更新 我应该澄清这些集合目前是从for循环中访问的:

for (int i = 0; i < thingsCount; i== ) {
    dosomthing( GetThing(i) );
    dosomethingelse( GetThing(i) );
}
Run Code Online (Sandbox Code Playgroud)

我正在重构:

for (int i = 0; i < thingsCount; i== ) {
    Thing thing = things[i];
    dosomthing( thing );
    dosomethingelse( thing );
}
Run Code Online (Sandbox Code Playgroud)

甚至可以使用things.foreach().

Dan*_*Tao 6

我不知道这是否显而易见,但我认为你错过了什么.

让我们说things是一个IList<Thing>.然后直接将其暴露(如Things)将允许调用代码调用Add,Insert,RemoveAt,等也许以前开发商不想让这个(我敢肯定有很多很好的原因是什么).

即使假设它是a Thing[](因此Add,等等也不可用),因此将它暴露出来仍然允许调用代码来执行某些obj.Things[0] = new Thing();操作,这可能是一个不应该被允许的操作,具体取决于类的实现.

可以将其暴露出来Things,以ReadOnlyCollection<Thing>解决大多数这些问题.但是它归结为是这样的:如果开发商希望允许调用代码通过索引来访问项目-仅此而已-然后提供了一个单一GetThing的手段做方法,因此,说实话,是迄今为止最常识让.

现在,授予,还有这个选项:实现this[int]只有一个get访问者的属性.但是,才有意义,如果有问题的类本质的集合Thing对象仅仅(即没有有些集合其他你想提供内部类访问类型的对象).

总而言之,我认为这种GetThing方法非常合理.

也就是说,从您提出问题的方式来看,这听起来像以前的开发人员做出了一些其他非常糟糕的决定:

  1. 如果他/她things直接将收藏品作为公共财产曝光,那么......那就是打败了GetThing方法的全部目的,不是吗?结果只是一个膨胀的界面(我通常认为,当你有多种方法完成同样的事情时,它不是一个好兆头,除非出于某种正当理由将它们清楚地记录为别名).[ 更新:以前的开发人员似乎没有这样做.好.]
  2. 看起来之前的开发人员也在内部things使用该GetThing方法访问项目,这很愚蠢(在我看来).为什么在类本身内使用类的公共接口引入额外方法调用的无意义开销?如果你在课堂上,你已经在实现中,并且可以访问所有你想要的私人/受保护数据 - 不需要假装.