在一个地方存储所有字符串的静态类的性能

时间:2014-11-23 17:23:36

标签: c# asp.net-mvc performance asp.net-mvc-5 refactoring

我正在考虑通过创建一个静态类来重构我的代码,该类在一个地方保存所有字符串,用于网站中使用的所有消息/密钥/等。这样可以简化维护工作。

现在,我关注的是以下内容。

根据我在php的经验,负载的速度非常重要。我必须平衡硬编码和动态生成的内容。

一般来说,我的重构会如何影响加载速度?由于C#Web应用程序是预编译的,这不是一个真正需要考虑的问题吗?

4 个答案:

答案 0 :(得分:2)

考虑使用Resource files来管理字符串。通过简单地添加具有不同文化后缀的新资源文件,使用资源文件具有更容易实现国际化的附加优势。

Resouces被编译为线程安全的缓存类,因此最好在静态类中使用静态只读字段。主要优点是它更易于维护,因为

  1. 这是一种常见的做法
  2. 您可以使用资源编辑器编辑字符串
  3. 更改资源位置(例如,在DB中存储字符串)很容易
  4. 您可以替换资源库而无需重新编译整个网站
  5. 这是一个很容易本地化的网站
  6. 列出要翻译的所有字符串很容易

答案 1 :(得分:1)

如果要对永不改变的常量使用静态类,请不要。使用常量:

public class Constants
{
    public const string Message1 = "Here is a message";
    public const int Value1 = 17;
}

在这种情况下,您可以在代码中使用这些常量:

Constants.Message1
Constants.Value1

优点是常量在编译期间被替换为实际值,因此在运行时不会加载类Constants。您仍然可以在一个地方更新常量

答案 2 :(得分:1)

String是.NET中非常特殊的类型。它是不可变的(与许多其他语言相同)。这意味着如果你执行“str 1”+“str 2”,你将得到另一个对象“str 1str 2”。所以要小心动态字符串生成。如果需要在运行时连接大量字符串,请考虑StringBuilder class。

当您在程序集(项目)中对字符串进行硬编码时,.NET会将这些字符串放入字符串池中,每当您使用此字符串(甚至创建具有相同值的新字符串)时,.NET都会返回指向现有字符串的指针这个游泳池。如果此池中不存在字符串,.NET还会将新创建的字符串放入实习池中。

More info about string intern pool

通常,将所有字符串放入静态类都不会有问题。但请记住上面的信息,以避免潜在的性能问题和错误。

答案 3 :(得分:1)

许多人在Web应用程序 evil 中考虑静态变量,因为它们处于全局范围并且违反了OOP原则。其他人故意使用它们来获得(通常可疑的)Web应用程序中的性能提升。

请记住,通过使用静态变量,您可以为time交换space性能,因为即使从未使用过/访问过,您的变量也会分配一定量的内存。

事实是,您将获得一些响应时间增益,并通过使用它们来节省一些垃圾收集器的工作。

在可维护性/灵活性方面,使用静态字符串变量可能不是最好的方法。如果你的主要目标是使用Resx来简化维护resource files可能是一种更安全的方法,并且读取将使用常量时间,因为它使用读取缓存值的线程安全静态属性。

但是,在Web应用程序中使用静态变量时应始终保持谨慎,因此我将以Scott Hanselman的明智话语结束我的帖子:

  

当使用ASP.NET时,请再次考虑,然后再将静态(或共享)关键字抛出。也许有一个范围更适合你尝试做的事情。