Estou desenvolvendo um aplicativo do Windows e quero armazenar todo o texto para etiquetas, botões de opção, botões, caixas de seleção e cabeçalhos de colunas de grades em um único local. Eu tentei usar um arquivo de classe, um arquivo xml, uma tabela de banco de dados e um arquivo de recurso.
Descobri que um arquivo de classe é a melhor maneira de armazenar todos esses textos, mas quero saber se existe algum caminho alternativo. Se eu estiver usando um arquivo de classe, terei que recompilar o projeto se houver alteração de texto.
Um arquivo de recurso funcionará corretamente para grandes quantidades de dados? Que tal um dicionário ou armazenamento de dados em variáveis?
Respostas:
Em resumo: Parece-me uma localização de recursos (tipos diferentes, como rótulos estáticos, texto, etc.). De um modo geral, as alterações no conteúdo do arquivo de recursos não devem exigir a recriação do aplicativo.
A desvantagem de armazenar recursos nas classes é que cada alteração / modificação exigirá uma recriação do aplicativo win-form.
Eu acho que a limitação é a limitação de tamanho de arquivo do sistema operacional e é de 4 GB em sistemas de 32 bits, se bem me lembro. Para 64 bits, deve ser ainda maior. De qualquer forma, com o objetivo de armazenar o texto estático, ele deve ser mais do que suficiente.
Assim, na minha opinião, isso não deve ser feito em nenhum outro lugar se o texto for estático.
Uma abordagem alternativa seria criar uma classe para controlar o acesso aos seus arquivos de recursos. Essa classe pode ser usada para armazenar as chaves para acessar seus arquivos de recursos e ter uma maneira fortemente digitada de recuperar os recursos disponíveis do projeto.
Algumas referências nas respostas do SE sobre localização e recursos:
Referências do MSDN :
fonte
Eu acho que você mencionou tudo.
Se você deseja algo flexível, em que não precise recompilar, o banco de dados pode ser sua melhor opção.
Mas, caso contrário, eu iria com. Resx, pois esse é o padrão.
Salvar texto em arquivos de classe é uma péssima idéia.
fonte
Além do formato .resx, você também pode usar arquivos .txt ou .restext, que estão em um formato mais simples (e mais fácil de ler e editar).
Criando arquivos de recursos para aplicativos da área de trabalho (consulte a seção "Recursos em arquivos de texto")
O formato é essencialmente
name = value
, com a capacidade de ter comentários e compilação condicional.Outra opção é usar o arquivo de origem ou de texto que você deseja e criar o arquivo .resources binário manualmente ou como parte de uma etapa de construção. (consulte "Recursos em arquivos .resrouces" no link acima).
De qualquer forma, há um pouco mais de trabalho para incluí-las no seu projeto e na compilação, mas ambos têm o benefício de ter suporte para vários idiomas, assim como o arquivo .resx.
fonte
Em C #, é quase certo que você esteja melhor usando um arquivo de recursos (que é um arquivo XML). Isso oferece os seguintes benefícios:
fonte
Eu tinha um requisito semelhante antes e armazenei recursos em um arquivo .resx, mas decidi usar classes para armazenar as chaves.
Por exemplo, digamos que tenho recursos para a tela de saque bancário.
Eu criei uma classe simples nas linhas de
Eu implementei uma classe para recuperar recursos. Meu objetivo era ter uma maneira fortemente tipada de extrair recursos. Eu também queria tornar a unidade de recuperação de recursos testável. Eu extraído uma interface para recuperar recursos:
IResource
.Cada vez que eu queria usar recursos, eu recebia uma implementação por meio do contêiner de IoC.
Finalmente, quando se tratava de usar o recurso, eu teria algo nas linhas de:
Na linha acima, usei a expressão lambda que me permitia visualizar todos os recursos disponíveis por meio do intellisense.
Quando se tratava de testes de unidade, eu zombava
IResource
e estabelecia expectativas.Por exemplo:
Observe também que extraímos uma interface para recuperação de recursos. Por esse motivo, agora podemos armazenar recursos em qualquer lugar que desejarmos. Por exemplo:
Eu escrevi acima do topo da minha cabeça no bloco de notas, então se você tiver algum problema, avise-me e adicionarei a implementação mais tarde.
fonte
Acabei de fazer algo semelhante após esta explicação passo a passo do CodeProject: link
É para transformar vários arquivos de texto facilmente atualizáveis em arquivos de recursos que você pode adicionar ao seu projeto para ter idiomas diferentes (no meu caso, uma caixa de combinação permite que eu mude entre tantos idiomas quanto crio arquivos de recursos)
A vantagem disso em relação aos arquivos .resx é que você pode ter apenas 1 por idioma por projeto, em vez de ter 1 por idioma por formulário
Apenas outra coisa para pensar
fonte
O Objeto Portátil (.po) é muito popular e praticamente um padrão fora do mundo .NET. Eu o vi usado em alguns projetos C # (por exemplo, https://github.com/OrchardCMS/OrchardCore/tree/d729a2048a4390380d99e7be9f7968ff8f8e9271/src/OrchardCore/OrchardCore.Localization.Core ). Não há suporte oficial para ele, mas o formato não é tão complexo e existem algumas bibliotecas para ele: https://github.com/neris/NGettext
O formato é definitivamente mais simples que o .resx, pois não é baseado em XML. Você tem muitas ferramentas para isso, por exemplo, pootle, poedit e muito mais ...
Outra opção é usar algum formato simples (ou personalizado) como JSON / YAML / TOML, ou mesmo algo tão simples quanto
Key=Value
em texto sem formatação com alguma convenção de nomenclatura de arquivosLocale.{languagecode2-country/regioncode2}
. Você pode então incorporá-lo como um recurso em sua montagem :) Mas é necessário criar sua própria ferramenta de tradução ou algum conversor de / para po / resx para trabalhar com as ferramentas existentes.Fora isso, .resx é o caminho oficial e a primeira opção a seguir. As ferramentas também são decentes: https://github.com/tom-englert/ResXResourceManager
fonte