使用外部文件或资源?

时间:2009-05-11 15:46:20

标签: c# .net resources embedded-resource

我正在编写一个使用长“硬编码”字符串的C#应用​​程序。

出于可维护性原因,我决定将此字符串放在外部文本文件中并加载它。这是一个好主意吗?在这种情况下,额外的I / O似乎并不大。

我意识到我还可以选择将此文件作为.resx资源嵌入。这是一个更好的主意吗?该文件永远不需要本地化。

6 个答案:

答案 0 :(得分:14)

如果您打算允许用户/管理员更改字符串,我同意其他答案,我建议将其置于设置中。

如果您不希望它在部署后可编辑,并且只会由您和您的开发人员修改,那么我会将其放在嵌入式资源中(注意,这与.resx文件不同) 。您可以在运行时阅读它:

Assembly assembly = Assembly.GetExecutingAssembly();
Stream stream = assembly.GetManifestResourceStream(“MyAssemblyNamespace.MyTextFile.txt”);
StreamReader reader = new StreamReader(stream);
string theText = streamReader.ReadToEnd();

更新:这是易于维护的解决方案。 .txt文件将只是Visual Studio中解决方案资源管理器中的另一个文件,您可以像编辑任何其他文件一样对其进行编辑,将其保存在源代码控制之下,就像任何其他文件一样,等等。通过更改构建将其转换为嵌入式资源在属性窗口中对“嵌入式资源”执行操作。

最终结果是您的文件嵌入到您的DLL中,因此您只需要分配1个DLL而不是DLL和必须一起移动的文件的文件夹。

更新2:关于“生产调试”,这是一个非常静态的解决方案,因此您无法在运行时更改文本文件的内容,因为该文件已烘焙到DLL在编译时。要读取文件的内容,可以使用reflector之类的工具来查看DLL的嵌入资源。您还可以编写一个简单的命令行工具,将DLL中的所有嵌入式.txt文件转储到单个文件中供您查看。

对于内存使用,没有比“我只在需要时将文件从文件加载到内存中”更有效的解决方案。当您的DLL根据您的特定情况加载到内存中时,您必须决定改进的可维护性和部署是否值得花费额外内存的成本。也就是说,你还没有说这些文件有多大。如果它们真的很大(兆字节+),我可能使用这个解决方案,并将使用硬盘驱动器上的松散文件。如果它们通常非常小(几百千字节),我不会担心额外的内存,除非你处于某种嵌入式设备的情况下RAM非常紧张。

答案 1 :(得分:4)

为什么不在web / app.config文件中将其设为appSetting?

<appSettings>
   <add key="MyLongString" value="This is a really long string value that I don't want hardcoded" />
</appSettings>

然后,在代码中:

using System.Configuration;    //To ease your typing pains

var myReallyLongString = ConfigurationManager.AppSettings["MyLongString"];

答案 2 :(得分:1)

我建议使用应用程序设置。

您可以关注此MSDN链接how to use Application and User Settings

答案 3 :(得分:1)

我会把它放在application configuration file

答案 4 :(得分:1)

更好的方法是将“设置”文件添加到项目中。然后,您可以通过Visual Studio轻松添加配置设置。 请参阅this link

然后,您可以使用以下内容访问您的字符串:

Settings.Default.MyString;

此外,设置是强类型的,因此您在检索时无需进行任何转换。

答案 5 :(得分:0)

为了更直接地回答您的问题,“最佳实践”是在您的应用程序中为任何可本地化的(即使您不打算将其本地化)字符串使用资源文件。这允许您对字符串进行编译时访问,并使其不会作为单独的文件外部化,以便与您的应用程序一起部署。

我建议使用这种方法;设置类似,但不应使用,除非您存储的内容实际上代表一个设置。常量是另一种选择,但在长字符串的情况下,我只是为了可维护性而远离它们。