12

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

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

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

是否优于:

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

谢谢!

4

10 回答 10

17

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

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

当然,如果你知道你打算在哪里调用它,你通常aFileInfo而不是 a string,那是另一回事。

我可以看到您同事的观点-在某些方面, aFileInfo是表达参数的“更干净”的方式。我认为这string是更务实的方法:)

于 2009-05-26T20:48:44.010 回答
6

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

于 2009-05-26T20:50:34.287 回答
5

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

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

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

于 2009-05-26T20:52:34.937 回答
3

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

于 2009-05-26T20:48:52.417 回答
2

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

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

于 2009-05-26T20:57:29.420 回答
2

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

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

于 2009-05-26T21:01:14.343 回答
1

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

于 2009-05-26T20:49:28.483 回答
1
  1. 字符串不是 PATH。所以字符串不是表示路径的最佳方式。
  2. FileInfo 也不是 PATH,语义上它代表 FILE。

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

于 2009-05-30T11:38:52.370 回答
0

我会遵循使用 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 等。

于 2009-05-26T20:55:40.407 回答
0

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

如果您绝对想不出需要更复杂行为的场景,并且它真的会让您失望,那么请继续使用字符串。

于 2009-05-26T21:09:12.283 回答