我正在考虑通过创建一个静态类来重构我的代码,该类在一个地方保存所有字符串,用于网站中使用的所有消息/密钥/等。这样可以简化维护工作。
现在,我关注的是以下内容。
根据我在php的经验,负载的速度非常重要。我必须平衡硬编码和动态生成的内容。
一般来说,我的重构会如何影响加载速度?由于C#Web应用程序是预编译的,这不是一个真正需要考虑的问题吗?
答案 0 :(得分:2)
考虑使用Resource files来管理字符串。通过简单地添加具有不同文化后缀的新资源文件,使用资源文件具有更容易实现国际化的附加优势。
Resouces被编译为线程安全的缓存类,因此最好在静态类中使用静态只读字段。主要优点是它更易于维护,因为
答案 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时,请再次考虑,然后再将静态(或共享)关键字抛出。也许有一个范围更适合你尝试做的事情。