【问题标题】:When passing a file name to a method, should I use FileInfo or a plain file name?将文件名传递给方法时,我应该使用 FileInfo 还是纯文件名?
【发布时间】:2009-05-26 20:45:19
【问题描述】:

嗯,标题说明了一切。将文件名传递给方法时,我应该使用 FileInfo 对象还是纯文件名(字符串)?为什么我更喜欢其中一个?

我的一些同事喜欢这样写方法:

  • 无效导出(文件信息文件信息)

是否比:

  • 无效导出(字符串文件名)

谢谢!

【问题讨论】:

  • 甚至可以接受一个为写入而设置的 Stream 对象......更通用......可以写入文件或网络......
  • 我只想补充一点,这是一个很好的问题,但如果您有一个重载方法并使用它,请在整个代码中保持一致。

标签: c# fileinfo


【解决方案1】:

我通常只使用string - 在大多数情况下更简单。否则,您很可能首先从字符串创建一个新的FileInfo

如果您正在创建方法,则始终可以提供重载来允许两者。

当然,如果您知道要调用它的位置,您通常FileInfo 而不是string,那是另一回事。

我可以理解您同事的观点 - 在某些方面,FileInfo 是一种“更简洁”的参数表达方式。我认为string 是更务实的方法:)

【讨论】:

  • 我也使用字符串。如果我想使用它提供的其他东西,我只会考虑使用 FileInfo——比如 CreationTime。
  • 我对此非常感兴趣。为什么用字符串表示文件?这有点像用字符串表示 XML 文档。
  • +1 - 强制消费者传递 FileInfo 是愚蠢的,除非你明确地使用它,因为你会得到这样的代码:Export(new FileInfo(@"C:\File\Path \Here.txt"));呜呜呜!那应该在方法中,而不是在你调用方法的地方!
  • @Esteban - 您不是用字符串表示文件,而是表示文件的路径,一个字符串。
  • @Esteban:我认为将 xml 文档表示为字符串并没有错,假设您将它传递给另一个函数而不是尝试解析它。但是 XML 文件通常来自某个地方,所以我更倾向于使用要读取该 xml 文件的函数从这样的位置加载它。我通常不会将 xml 文件作为 xmlreader 或其他任何东西传递,因为创建一些用于解析 xml 文件的机制是任何函数将要进行解析的责任。
【解决方案2】:

通常我会传递字符串。 但是,您可以重载该方法以使每个人都开心。

【讨论】:

  • +1 完全是我的选择。我们还可以引入 CShartAtl 对问题的评论中的建议,并有一个接受 Stream 的重载。
  • 这肯定也是我的偏好。
【解决方案3】:

不同之处主要在于进行了一些检查; FileInfo 构造函数对 null 或明显无效的参数进行一些检查。它还有其他一些功能;采用 FileInfo 基本上只是将处理来自 FileInfo 构造函数的异常的责任放在调用代码上,而不是您的代码。

这是 FileInfo 构造函数的 MSDN 参考,它显示了构造函数可以抛出什么:

http://msdn.microsoft.com/en-us/library/system.io.fileinfo.fileinfo.aspx

【讨论】:

    【解决方案4】:

    我会说这取决于:) 类 File 上的许多静态文件操作允许使用文件名进行许多操作。 File 的抽象在 .NET Framework 中并不常用,因此我倾向于使用字符串并在参数名称中表示它是什么。

    【讨论】:

      【解决方案5】:

      如果您正在编写涉及这些同事的代码,我会使用 FileInfo。这真的无关紧要,但按照其他人期望的方式编写代码会减少维护,提高一致性,并且通常会让人们开心。

      我会指出,我不喜欢使用 FileInfo 来将检查有效性的责任放在调用函数上,正如 McWafflestix 所指出的那样。如果调用函数和被调用函数之间出现中断,则不会被捕获。如果您使用字符串,它不一定会被捕获......但至少它可以清楚地表明问题可能发生在哪里。无论如何,您都希望在被调用的方法中捕获此类异常。当然,在您进入实际功能之前,您不会打开文件并开始读/写(如果您是,FileInfo 和 string 可能都是错误的选择,但 Stream 是有意义的,正如 TheSean 建议的那样)。

      【讨论】:

      • 请注意,这一切都假定该类是供内部使用的。如果客户打算使用您的代码,FileInfo 是一个糟糕的选择。
      【解决方案6】:

      FileInfo 比字符串更能显示数据类型的意图。这几乎总是一件好事。但是,当然有很多将文件名作为字符串传递的先例,包括大多数 .NET 框架本身。文件名是一个字符串。据推测,您应该让调用者使用 FileInfo 对象来强制调用代码验证文件名(即处理异常),而不是让自己负担传回异常的负担。

      当然,只要您验证传入的文件名,包括方法重载就可以消除所有疑虑。

      【讨论】:

        【解决方案7】:

        我认为如果做同样的事情,文件名就足够了。

        【讨论】:

          【解决方案8】:
          1. 字符串不是 PATH。所以字符串并不是表示路径的最佳方式。
          2. FileInfo 也不是 PATH,它在语义上表示 FILE。

          因此,如果 MS 将提供 Path 对象会更好:) 或者您可以自己制作,特别是如果这是您的内部代码。通过这种方式,您无需在每次使用 PATH 参数时检查它们。我经常有很多结构体代表不同的字符串,NonNullString, IdString(不区分大小写),我相信这让代码变得简单。

          【讨论】:

            【解决方案9】:

            我会遵循使用 Steam 的惯例。这就是我看到大多数 I/O 执行的方式。这对我来说很有意义:

            void Export(string s) 
            { 
              Stream fs = new FileStream(s); //think this is correct
              Export(fs); 
            }
            void Export(Stream s) 
            {
              s.Write ( ... );
              ...
            }
            

            我同意,FileInfo 对我来说从未如此有用。坚持使用字符串或使用流,可以是 FileStream、MemoryStream 等。

            【讨论】:

              【解决方案10】:

              像往常一样,这取决于。除了最基本的情况外,我想说的是,使用 FileInfo 会给您带来很多好处,而且几乎没有负面影响。严格的 OO 教条会说有关文件的信息(路径、创建日期、修改日期等)应该封装在 FileInfo 之类的类中。如果您需要更复杂的行为,这将为您提供更大的灵活性。如果您针对 FileInfo 编写代码,如果您需要进行更改,它几乎总是会更干净且不易出错。

              如果您绝对想不出需要更复杂行为的场景,而且它真的会让您感到厌烦,请继续使用字符串。

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 2017-01-11
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2019-03-18
                • 2016-11-14
                • 1970-01-01
                相关资源
                最近更新 更多