我试图找出在C#应用程序中处理各种类型常量的最优雅方法。
例如,我有一些在UserControl中显示的字符串常量
我还有一些常量是一些.xml配置文件的文件路径。
对于我的实际字符串,未来本地化支持的最佳方法是什么?对于我当前声明的常量(例如private const string xmlFilePath = @"Configuration\someFile.xml";
)的最佳方法是什么?
答案 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)
考虑到本地化,您应该为每个支持的文化使用资源文件。这将生成特定于每种文化的附属装配体:
然后使用这种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);