哪个是避免魔术字符串键的更好方法?在类中使用字符串const键还是使用枚举?

时间:2011-02-14 07:16:01

标签: c# asp.net-mvc

我的想法是避免在我的Asp.Net MVC应用程序中使用魔术字符串键。 为此,我想创建要在应用程序中共享的字符串常量键。

例如,我可以写TempData[MyClass.Message]TempData[MyEnum.Message.ToString()]而不是TempData["Message"]

public class MyClass
{
    public const string Message = "Message";
}

public enum MyEnum
{
   Message,
   Others
}

我的问题是:哪种方法可以避免使用魔法字符串键?在类中使用字符串const键或与ToString()一起使用枚举?

3 个答案:

答案 0 :(得分:5)

你应该去const字符串,因为它可以包含空格/特殊字符,如果那些是你的要求。否则将TempData更改为Dictionary<MyEnum,object>,这是更好的方法。

答案 1 :(得分:5)

取决于偏好和用法。

您可以以强类型方式接受枚举值:

public void SomeFunction(MyEnum someValue)
{
}

或者

TempData[MyEnum.Message]

使用const字符串,你不能。

您还有一种内置方法来枚举枚举中的值。

您还没有提供第三个选项,那就是将“常量”放在配置设置中(App.Config)。这将允许您在编译时配置它们。你现在可能不需要这个,但是将来可能会这样,所以值得考虑。

其中一个可能更适合全球化目的。我不确定哪个,因为我从来没有全球化应用程序。无论哪个在卫星装配中起作用,我都认为。

基本上,它取决于TempData是什么,以及您打算如何使用它。

答案 2 :(得分:2)

我知道这已经回答了,但我想在这里提出我的看法。你过于关注机制而不是你所遇到的问题 - 这就是“当我决定TempData [”Message“]实际上应该是Session [”Alert“]时,我如何摆脱破坏我的应用程序”(或类似的东西。

魔术字符串不适用于字典键 - 它们适用于发送到例程的消息,这些消息基于字符串值执行某些操作。像“SetStatus('current')”这样的东西会很神奇。

您要在此处执行的操作是使用集中式方法来处理消息传递。创建一个帮助程序类,如果你愿意,可以称之为“Messaging” - 如果你得到所有Railsy并称之为“Flash”。然后,你可以做一些像“Flash.Message(”Hi there“)”这样的事情 - 这会使机制隐藏(应该是这样),你不必担心那些愚蠢的字典键。

你也可以扩展这个 - “Flash.Alert('哦不!')” - 等等。