如何正确处理C#项目中的常量和文件路径常量

时间:2014-09-07 06:23:46

标签: c#

我试图找出在C#应用程序中处理各种类型常量的最优雅方法。 例如,我有一些在UserControl中显示的字符串常量 我还有一些常量是一些.xml配置文件的文件路径。 对于我的实际字符串,未来本地化支持的最佳方法是什么?对于我当前声明的常量(例如private const string xmlFilePath = @"Configuration\someFile.xml";)的最佳方法是什么?

3 个答案:

答案 0 :(得分:3)

我在我的项目中做的是我有一个单独的类项目,一个包含我的常量的类。这种方法的好处在于,如果我需要更改常量,我不需要重新编译我的主程序。我只需要重新编译我的常量项目,然后我就可以将该DLL上传到我的生产服务器。

您需要注意的唯一警告是,您需要制作readonly而不是const。像这样:

public readonly string XmlPath = @"Configuration\SomeFile.xml";

原因是因为常量被视为在文字处理器中复制和粘贴。编译器将查找const变量的值,然后将结果粘贴到程序中,然后使用可执行文件中的粘贴结果编译程序。这意味着如果您更改了常量的值,则必须重新编译依赖于该常量的每个项目。

通过使它成为readonly,您告诉编译器不要简单地将值粘贴到程序中,而是在运行时需要时查找值。

答案 1 :(得分:0)

我的解决方案中通常有一个名为Aliases.cs的文件,我存储了一些专门用于硬编码值的静态类。如果我没有缩写或神秘的名字,我喜欢保持流利。

这使得以后更改"硬编码"非常容易。设置为配置变量而不尝试使用find-replace,您可以交叉引用它,以便您可以看到您使用MagicNumbers的所有地方。

<强> Aliases.cs

namespace SolutionName.Classes
{
    public static class MagicNumbers
    {
        // Hardcoded Optional Values (tweakable without serious side-effects)
        public const int Max_Backups = 10;
        public const int Max_Console_Line_History = 1000;

        // Hardcoded Configuration settings (Changes will break logic, if you don't know what it's for)
        public const int Important_Foo_Bar_Setting = 1234;
    }

    public static class ConfigSettings
    {
        /*Never, ever change these constant string values!!! REQUIRED for backwards compatability!*/
        public const string VERSION_1_0 = "FooBar V1.0";
        public const string VERSION_1_1 = "FooBar V1.1";
        public const string VERSION_2_0 = "FooBar V2.0";

        /*This reference should be updated to the most recent VERSION_#_# constant defined above.*/
        public const string CURRENT_VERSION = VERSION_2_0;
    }

    public static class Folders
    {
        //Top Level Folders
        public const string Backups = @"\Backups";
        public const string Bin = @"\Bin";
        public const string Logs = @"\Logs";
        public const string Resources = @"\Resources";

        //Sub Folders
        public const string Reports = Bin + @"\Reports";
        public const string Old_Logs = Logs + @"\Old";
    }

    public static class FileTypes
    {
        public const string tmp = "~tmp";
        public const string dat = ".dat";
        public const string csv = ".csv";
        public const string txt = ".txt";
        public const string npp = ".npp";
        public const string iscfg = ".iscfg";
        public const string bkp = ".bkp";
        public const string xml = ".xml";
        public const string png = ".png";
        public const string tkn = ".tkn";
    }

    public static class Pattern
    {
        public const string WildCard = "*";
        public const string Date_yyyy_MM_dd_Format = "yyyy-MM-dd";
        public const string Time_HH_mm_ss_fff_Format = "HH:mm:ss.fff";
        public const string Logfile_Timestamp_Format = Date_yyyy_MM_dd_Format + " " + Time_HH_mm_ss_fff_Format;// "yyyy-MM-dd HH:mm:ss.fff";
    }
}

答案 2 :(得分:0)

考虑到本地化,您应该为每个支持的文化使用资源文件。这将生成特定于每种文化的附属装配体:

Localization with resources files

然后使用这种XAML标记:

<Window
  ...
  xmlns:resx="clr-namespace:OrderTaker.Properties">

<TextBlock Text="{x:Static resx:Resources.OrderWindow_Title}" /> 

这将根据应用程序的CurrentUICulture自动插入OrderWindow_Title的本地化字符串。

重要提示:不要忘记在resx定义窗口中将访问修饰符设置为public

对于特定于应用程序的字符串,例如xml文件路径,我会将它们存储在App.config文件中,使它们完全可以独立部署。在Properties文件夹中创建一个名为AppSettings的新设置文件(您必须在项目根目录中创建它,然后手动移动它)并将您在其中定义的每个值的范围标记为Application键/值编辑器中的(而不是User)。然后在代码中访问它:

Console.Write(Properties.AppSettings.Default.xmlFilePath);