2009-05-26 25 views
10

Bueno, el título lo dice todo. Al pasar un nombre de archivo a un método, ¿debería usar un objeto FileInfo o un nombre de archivo simple (cadena)? ¿Por qué preferiría uno el otro?Al pasar un nombre de archivo a un método, ¿debo usar FileInfo o un nombre de archivo simple?

Algunos de mis colegas les gusta escribir método como este:

  • vacío Exportación (FileInfo fileinfo)

¿Es mejor que:

  • vacío Exportación (cadena nombre del archivo)

Gracias!

+5

Podría incluso tomar en un objeto Stream que está configurado para escribir ... poco más genérico ... se puede escribir en el archivo, o web ... – CSharpAtl

+0

Solo quiero agregar que esta es una pregunta agradable, pero si tiene un método sobrecargado y lo usa, sea coherente en todo su código. –

Respuesta

17

Normalmente solía usar un string - es más simple en la mayoría de los casos. De lo contrario, es probable que simplemente cree un nuevo FileInfo de la cadena en primer lugar.

Si está creando el método, siempre puede proporcionar sobrecargas para permitir ambos.

Por supuesto, si usted sabe que donde está la intención de llamarlo, por lo general tiene FileInfo un lugar de un string, eso es un asunto diferente.

Puedo ver el punto de vista de sus colegas: de alguna manera, un FileInfo es una forma "más limpia" de expresar el parámetro. Creo que string es el enfoque más pragmático :)

+3

También uso cadenas. Solo consideraría usar FileInfo si quisiera usar algo más que ofrezca, como CreationTime. – RichardOD

+1

Estoy realmente interesado acerca de esto. ¿Por qué representar un archivo con una cadena? Parece un poco como representar un documento XML con una cadena. –

+1

+1 - Forzar al consumidor a pasar un FileInfo es una tontería a menos que esté trabajando explícitamente con uno, porque entonces obtiene un código como este: Exportar (nuevo FileInfo (@ "C: \ File \ Path \ Here.txt")) ; UUUGGLYY! Eso debería estar en el método, ¡no en el lugar al que llama el método! –

3

Yo diría que depende :) Muchas operaciones de archivos estáticos en la clase Archivo permiten una serie de cosas con el nombre del archivo. La abstracción de un archivo no suele ser útil en .NET Framework, por lo que estoy predispuesto a utilizar una cadena y denotar en el nombre del argumento lo que es.

1

Creo que el nombre del archivo será suficiente si está haciendo lo mismo.

6

Normalmente pasaba el hilo. Sin embargo, podría sobrecargar el método para hacer felices a todos.

+0

+1 Mi opción es exacta. También podríamos traer la sugerencia del comentario de CShartAtl a la pregunta y tener una sobrecarga aceptando un flujo. –

+0

Eso definitivamente sería mi preferencia también. –

5

La diferencia es principalmente que hay un poco de verificación en marcha; el constructor FileInfo hace alguna comprobación de un parámetro nulo o claramente inválido. Hay algunas otras cosas que hace; tomar un FileInfo básicamente solo le da la responsabilidad de manejar las excepciones del constructor FileInfo en el código de llamada, en contraposición a su código.

Aquí está la referencia de MSDN para el constructor FileInfo que muestra lo que el constructor puede lanzar:

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

0

que siguieran la convención de usar Stearns. Así es como veo que se realizan más E/S. Tiene sentido para mí:

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

Acepto, FileInfo nunca me ha sido tan útil. seguir con la cadena o usar stream que puede ser FileStream, MemoryStream, etc.

2

Si está trabajando en un código que involucre a estos colegas, usaría FileInfo.Realmente no importa mucho, pero escribir código de la manera que otros esperan reduce el mantenimiento, aumenta la consistencia y, en general, hace felices a las personas.

Señalaré que no me gusta la idea de usar FileInfo con el fin de poner la carga de los cheques en la función de llamada, como lo señaló McWafflestix. Si algo se rompe entre la función de llamada y la función que se llamó, no se detectará. No necesariamente será capturado si usa una cadena ... pero al menos deja en claro dónde puede ocurrir el problema. Y querrá capturar tales excepciones en el método llamado de todos modos. Seguramente no abrirá el archivo y comenzará a leer/escribir hasta que esté en la función real (si lo está, FileInfo y string probablemente sean la elección incorrecta, pero Stream tiene sentido, como sugiere TheSean).

+0

Tenga en cuenta que todo esto supone que la clase es para uso interno. Si los clientes van a usar su código, FileInfo es una mala elección. – Brian

2

Un FileInfo hace más para mostrar la intención del tipo de datos que una cadena. Y eso casi siempre es algo bueno. Sin embargo, ciertamente hay muchos precedentes de pasar un nombre de archivo como una cadena, incluida la mayor parte del propio framework .NET. Un nombre de archivo es una cadena. Presumiblemente, hará que la persona que llama use el objeto FileInfo para obligar al código de llamada a validar el nombre del archivo (es decir, manejar la excepción) en lugar de cargarse a sí mismo con la devolución de la excepción.

Ciertamente, incluyendo una sobrecarga del método eliminaría toda duda, siempre y cuando usted está validando el nombre del archivo que se pasa en.

0

Como de costumbre, depende. En todos los casos, salvo en los más básicos, diría que el uso de FileInfo ofrece muchos beneficios con casi ningún aspecto negativo. El dogma de OO estricto diría que la información sobre un archivo (ruta, fecha de creación, fecha de modificación, etc.) debe ser encapsulada dentro de una clase como FileInfo. Esto le permitirá más flexibilidad si más adelante necesita un comportamiento más complejo. Si escribe su código contra FileInfo, casi siempre será más limpio y menos propenso a errores si necesita realizar cambios.

Si no puedes pensar en un escenario en el que necesitarías un comportamiento más complejo, y realmente te va a hacer perder el control, adelante y simplemente usa una cadena.

1
  1. Cadena no es RUTA. Entonces, la cadena no es la mejor manera de representar la ruta.
  2. FileInfo tampoco es una RUTA, semánticamente representa ARCHIVO.

Así que esto será mejor si MS proporcionará Path object :) o puede hacerlo usted mismo, especialmente si este es su código interno. De esta forma, no necesitará verificar los argumentos de PATH cada vez que trabaje con ellos. A menudo tengo muchas estructuras que representan diferentes picaduras, NonNullString, IdString (no distingue entre mayúsculas y minúsculas), creo que esto hace que el código sea simple.

Cuestiones relacionadas