Ao passar um nome de arquivo para um método, eu deveria usar FileInfo ou um nome de arquivo simples?

StackOverflow https://stackoverflow.com/questions/912662

  •  06-09-2019
  •  | 
  •  

Pergunta

Bem, o título diz tudo. Ao passar um nome de arquivo para um método, que eu deveria usar um objeto FileInfo ou um nome de arquivo simples (string)? Por que eu iria preferir um ao outro?

Alguns dos meus colegas como o método de escrita assim:

  • vazio Exportação (FileInfo fileInfo)

É melhor do que:

  • vazio Exportação (string fileName)

Obrigado!

Foi útil?

Solução

Eu geralmente apenas usar um string - é simples na maioria dos casos. Caso contrário, é provável que você simplesmente criar um novo FileInfo da corda em primeiro lugar.

Se você estiver criando o método, você pode sempre fornecer sobrecargas para permitir ambos.

Claro que, se você sabe que onde você está com a intenção de chamá-lo, você geralmente Have a FileInfo em vez de um string, isso é uma questão diferente.

Eu posso ver o ponto de vista dos seus colegas - de certa forma um FileInfo é uma forma 'limpa' de expressar o parâmetro. Acho string é a abordagem mais pragmática embora:)

Outras dicas

Normalmente eu iria passar a corda. No entanto, você pode sobrecarregar o método para fazer todos felizes.

A diferença é basicamente que há um pouco de verificação acontecendo; o construtor FileInfo faz uma verificação para um valor nulo ou parâmetro claramente inválido. Há algumas outras coisas que ele faz; tomar um FileInfo, basicamente, apenas coloca o ónus de lidar com as exceções do construtor FileInfo no código de chamada, ao contrário de seu código.

Aqui é a referência do MSDN para o construtor FileInfo que mostra o que o construtor pode jogar:

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

Eu diria que depende :) Muitas operações de arquivo estático no arquivo classe permitem uma série de coisas com o nome do arquivo. A abstração de um arquivo não é que muitas vezes útil no .NET Framework, por isso estou inclinado para usando uma corda e denotando em nome argumento o que é.

Se você está trabalhando em código envolvendo esses colegas, gostaria de usar FileInfo. Realmente não importa muito, mas escrever o código da maneira os outros esperam que reduz maintainence, aumenta a consistência, e geralmente faz as pessoas felizes.

eu gostaria de salientar que eu não gosto da idéia de usar FileInfo por uma questão de colocar o ônus de cheques para a validade na função de chamada, como fora apontado por McWafflestix. Se algo quebra entre a função de chamada e a função que foi chamado, ele não vai ser pego. Ele não vai necessariamente ser capturado se você usar uma corda ... mas pelo menos deixa claro de onde o problema pode acontecer. E você vai querer pegar essas exceções no método chamado de qualquer maneira. Certamente você não está indo para abrir o arquivo e começar a leitura / escrita até que você esteja na função real (se você for, FileInfo e corda são, provavelmente, tanto a escolha errada, mas Corrente faz sentido, como TheSean sugere).

A FileInfo faz mais para mostrar a intenção do tipo de dados de uma string. E isso é quase sempre uma coisa boa. No entanto, há certamente uma abundância de precedente para passar um nome de arquivo como uma string, incluindo a maioria do próprio framework .NET. Um nome de arquivo é uma string. Presumivelmente, você teria o uso chamador o objeto FileInfo para forçar o código de chamada para validar o nome do arquivo (ou seja, tratar a exceção), em vez de sobrecarregar-se com a passagem de volta a exceção.

Certamente, incluindo uma sobrecarga de método iria remover todas as dúvidas, desde que você está validando o nome do arquivo que está sendo passado.

Eu acho que nome do arquivo será suficiente se ele está fazendo a mesma coisa.

  1. Cordas não é PATH. Então cadeia não é a melhor maneira de representar caminho.
  2. FileInfo também não é um caminho, semanticamente representa FILE.

Então, isso vai ser melhor se o MS irá fornecer objeto Path :) ou você pode fazer isso sozinho, especialmente se este é o seu código interno. Desta forma, você não terá que verificar os seus argumentos de caminho cada vez que você vai trabalhar com eles. Eu muitas vezes tem muitas estruturas que representam diferentes picadas, NonNullString, idString (maiúsculas e minúsculas), acredito que isso faz com que o código simplesmente.

Gostaria de seguir a convenção de usar Vapores. Isto é como eu vejo mais I / O realizadas. Faz sentido para mim:

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

Eu concordo, FileInfo nunca foi tão útil para mim. vara com corda ou corrente uso que pode ser FileStream, MemoryStream, etc.

Como de costume, ele depende. Em todos, mas o mais básico dos casos, eu diria que usar FileInfo dá-lhe uma série de benefícios com quase nenhum negativo. Estrita dogma OO diria que as informações sobre um arquivo (caminho, data de criação, data de modificação, etc) deve ser encapsulado dentro de uma classe como FileInfo. Isto irá permitir-lhe mais flexibilidade, se no caminho que você precisa comportamento mais complexo. Se você escrever seu código contra FileInfo, será quase sempre mais limpo e menos bug-propensa se você precisar fazer alterações.

Se você absolutamente não pode pensar em um cenário onde você precisa de um comportamento mais complexo, e está indo para realmente jogá-lo fora, vá em frente e usar apenas uma string.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top