【问题标题】:Why does .NET System.IO.File use Create/Open instead of a constructor?为什么 .NET System.IO.File 使用 Create/Open 而不是构造函数?
【发布时间】:2014-09-19 19:46:43
【问题描述】:

System.IO.File 没有构造函数。而是使用创建/打开静态方法。

为什么不使用构造函数创建或打开 File?

调用构造函数是否意味着调用构造函数的代码“拥有”该对象,而对于像文件这样的对象只是包装文件系统拥有的文件的句柄的情况并非如此?这是一些 OOP 约定、.NET/C# 约定,还是纯粹是任意的?

【问题讨论】:

  • 在 C++ 中,可以使用标志构造 std::fstream 来指示打开现有文件或创建新文件。但它也允许空构造,然后调用 open 带有控制是创建新文件还是打开现有文件的标志。也许 C# 的做事方式是 OOP 的更现代版本。
  • 我认为 CreateOpen 与操作相关联,而不是对象。你打开一个文件,你没有创建一个“打开”。由于这些操作与实例无关,因此它们是静态的。
  • 当然,您可以创建一个 File 对象,并以某种方式指定您是要打开它还是创建它或什么。这将导致各种复杂的构造函数。工厂模式正是你想要的。设计是正确的。

标签: c# .net oop


【解决方案1】:

File 类是 .NET Framework 1.0 版的后期添加。在 Microsoft 进行可用性研究后添加。他们邀请了以前从未使用过 .NET 的程序员,并要求他们编写使用 FileStream 和 StreamWriter 类的代码。那些有构造函数的。成功率

所以他们想出了 File,它有一堆创建/打开文件的静态辅助方法。将它们视为工厂方法。不,您不创建文件。你用吧。查看你最喜欢的关于静态类的 C# 编程语言书籍。

【讨论】:

    【解决方案2】:

    File.CreateOpen 实际上并没有实例化File,它们返回一个新的FileStream 用于访问磁盘上文件中的数据。

    它们本质上是FileStream Constructors 的工厂方法,作为FileStream 实例的构造函数处理。

    【讨论】:

      【解决方案3】:

      File 只是为您实例化其他类的辅助类。 “文件”本身是文件系统上的对象,而不是 .NET 中的对象。所以你有流、阅读器、FileInfo 等,它们都代表了与文件交互的不同方面。 .NET 中的File 类只是通向所有这些不同类的网关。

      【讨论】:

      • 是否有一个面向对象的术语,或者这是某种模式的例子或其他什么?我有点明白你在说什么,但是我发现很难清楚地表达和区分哪些类型的类代表了不在 .NET 中的对象。例如,遵循相同的思路,数据库是否应该创建/打开而不是构造函数?表示存储在该数据库中的事物的类呢?
      • 鉴于您可以构造 FileStream 实例,我开始怀疑您对“不在 .NET 中”的对象的推理。相反,我认为将任何对象视为存在于 .NET 中可能是有意义的,否则为什么它会是一个对象?
      • @JDiMatteo File 类是外观模式的一个示例。有一些方法可以简化常见操作,例如打开、复制、移动和将文本写入文件。也可以将某些方法称为工厂方法,因为它们会为客户端代码创建 FileStream 对象。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-12-18
      • 1970-01-01
      • 1970-01-01
      • 2015-06-10
      • 2012-06-28
      相关资源
      最近更新 更多