gpt4 book ai didi

c# - objects.GetObject(i) 比 objects[i] 有什么优势?

转载 作者:太空狗 更新时间:2023-10-29 21:11:03 26 4
gpt4 key购买 nike

我正在重构以前开发人员的一些 C# 数据访问代码,并且对他使用的模式很好奇。

代码最初公开了各种 ActiveRecord 样式业务对象的集合(数组)——本质上是包装数据库字段的对象。我正在将数组更改为通用列表,但我对代码的方面感到好奇的是,以前的开发人员对他包装的每种类型的对象都有 Get 方法,因此:

public Thing GetThing(int i) {
return things[i];
}

这些方法有好几种,我一辈子都想不出使用这种机制比直接引用 things[i] 有什么可能的优势。为了便于讨论,我们假设 things 是一个公共(public)属性,而不是一个公共(public)字段(在这种情况下,它实际上是一个自动实现的属性,所以这个假设实际上是正确的)。

我是否遗漏了一些明显的东西?甚至是深奥的东西?

更新我可能应该澄清一下,这些集合当前是从 for 循环中访问的:

for (int i = 0; i < thingsCount; i== ) {
dosomthing( GetThing(i) );
dosomethingelse( GetThing(i) );
}

我重构为:

for (int i = 0; i < thingsCount; i== ) {
Thing thing = things[i];
dosomthing( thing );
dosomethingelse( thing );
}

甚至可能使用 things.foreach()。

最佳答案

我不知道这是否显而易见,但我确实认为您遗漏了一些东西。

假设things是一个 IList<Thing> .然后直接公开它(如 Things )将允许调用代码调用 Add , Insert , RemoveAt等。也许以前的开发人员不想允许这样做(而且我相信有很多充分的理由)。

即使假设它是 Thing[] (所以 Add 等将不可用),这样公开它仍然允许调用代码执行类似 obj.Things[0] = new Thing(); 的操作。根据类的实现,这可能是不允许的操作。

可以暴露Things作为ReadOnlyCollection<Thing>这将解决大多数这些问题。但归根结底是:如果开发人员希望允许调用代码按索引访问项目——仅此而已——然后提供一个 GetThing方法作为这样做的手段,老实说,是迄今为止最有意义的。

现在,当然,还有这个选项:实现 this[int]只有 get 的属性(property)访问器(accessor)。但这只有在所讨论的类本质上是 Thing 的集合时才有意义。独占对象(即,没有您希望在类中提供对某些其他类型对象的集合)。

总而言之,我认为 GetThing方法非常合理。

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

  1. 如果他/她暴露了things直接作为公共(public)属性(property)收集,好吧,那么……这违背了GetThing的全部目的。方法不行吗?结果只是一个臃肿的界面(我通常认为,当您有多种方法来完成完全相同的事情时,这不是一个好兆头,除非出于某些合理的原因将它们明确记录为别名)。 [更新:以前的开发者似乎没有这样做。好。]
  2. 看起来以前的开发人员也在内部访问来自 things 的项目使用 GetThing方法,这很愚蠢(在我看来)。为什么要在类本身内部使用类的公共(public)接口(interface)引入额外方法调用的毫无意义的开销?如果您在类里面,那么您已经在实现中并且可以随心所欲地访问私有(private)/ protected 数据——无需假装。

关于c# - objects.GetObject(i) 比 objects[i] 有什么优势?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3159045/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com