公共常量字符串?

28

我是否可以像这样使用一个类(仅针对设计/指南)?我正在使用MVVM模式。

public static class Pages
{
    public const string Home = "Home.xaml";
    public const string View2 = "View2.xaml";
    /* a few more... */
}

2
为了公开可见性,我更喜欢使用 static readonly 而不是 const,因为这样您可以在之后更改值而无需重新编译。 - mgronber
3
这取决于上下文。在我开发的大多数情况下,如果您更改一个程序集,那么在使用新版本之前,您需要重新编译该程序集的客户端。 - Jon Skeet
4个回答

44

constpublic static readonly 之间存在显著差异,您应该仔细考虑使用哪种:

(这里的“客户端”是指“引用成员的不同程序集中的代码。”)

  • 如果您更改值但不重新编译客户端,则使用 const,客户端仍将使用原始值。如果使用 public static readonly,它们将看到更新的值。如果无论如何都要重新编译所有客户端,则这不是问题。
  • 只有 const 是编译时常量,这意味着它可以用于:
    • 属性参数
    • Switch 语句
    • 可选参数声明

如果您愿意在更改值时重新编译所有客户端,第二个要点的好处倾向于使用 const

当然,我想知道是否需要将 Pages 设为公共的...它听起来像是可以使用 internal,具有 internal 成员 - 这时候 const 的缺点就完全消失了。


4
当使用const定义常量值时,有一个通用的指导原则:如果这些常量值不需要在汇编之外访问,则将其声明为。
internal static class Pages
{
    public const string Home = "Home.xaml";
    public const string View2 = "View2.xaml";
    /* a few more... */
}

在给出“使用静态只读字段代替常量”的通用建议之前,了解其优缺点绝对是值得的。考虑这样一种情况:如果 X 程序集发生更改,所有客户端都将被重新构建 - 这是业务中相当常见的情况。这是否会改变您的建议? - Jon Skeet
@JonSkeet 这并不是必须使用readonly!我已经提出了一个问题并得到了答案。在这种情况下,我认为不需要public class,所以建议使用internal class。此外,我认为了解const和readonly的工作原理很有用;因此,提供了相关链接。无论如何,我应该同意你在这里的建议。 :-) - AksharRoop
2
好的,你基本上说的是“如果需要公开访问,请使用public static readonly。” 如果阅读此网站的某些人没有《Effective C#》,即使应该公开访问,他们也不会立即了解实际情况下这不适用的情况。 - Jon Skeet

3

从设计的角度来看,如果使用单个静态对象来包含所有页面引用,可能会很快变得混乱。您不可以将其存储在实际的页面对象中吗?

class view2 {
    public const string PageName = "View2.xaml";

    ... other stuff ...
}

那么就按照以下方式调用它...
goTo(view2.PageName);

0

我认为这是你可以做的最好的事情之一。 更多建议:对于字符串,使用const是完全可以的。如果您想使用不同类型,请使用static readonly,然后在static构造函数中初始化。

对于使用枚举的不同方法,请参见this thread。由于您尝试做的事情看起来很像一个字符串枚举,所以这可能是您要走的路。

不要忘记,只要在代码中指定页面,进行更改(例如重命名或移动页面)就会很麻烦。考虑使用类似资源或站点地图的东西。 (如果您仅将该类用于页面列表,则我建议使用C#的强类型资源 - 它们将以与您的类相同的方式运行,而无需手动编写它们。)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接