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

标签 c# .net collections properties accessor

我正在重构以前开发人员的一些 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/

相关文章:

c# - 在 C# 中验证使用 BER/DER 编码的 ASN.1 格式的 DSA 签名

.net - "You must add a reference to assembly ' 系统.Data.Services.Client,版本=3.5.0.0 '"

c# - FluentMigrator 非集群主键 SQL Server?

c# - 当文件被不同的进程删除时,文件流会发生什么?

java - 为什么 Collections.binarySearch() 不能使用这个可比对象?

c# - 如何判断库代码中是否允许代码访问安全

c# - WebDriverException : 'SecurityError: The operation is insecure.' error using document. write() 在 Firefox 中通过 Selenium

java - 不使用 Iterator 从 Vector 中删除元素

java - 迭代器是否违反堆栈/队列数据结构?

c# - 从数据库生成 POCO/DTO 的工具 (SQL Server)