Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/337.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# N个静态字段与单个静态实例_C#_Static - Fatal编程技术网

C# N个静态字段与单个静态实例

C# N个静态字段与单个静态实例,c#,static,C#,Static,我正在研究单例格式,它与我以前使用的非常相似 我的问题是,这两种方法在内存和/或性能方面是否有任何区别,第二种方法是否更快,足以掩盖其使用量更大而无法写入和读取 下面是一个示例代码: 方法1 public static class TheSomething { public static String Title; public static String Description; public static String HowIsIt; public stat

我正在研究单例格式,它与我以前使用的非常相似

我的问题是,这两种方法在内存和/或性能方面是否有任何区别,第二种方法是否更快,足以掩盖其使用量更大而无法写入和读取

下面是一个示例代码:

方法1

public static class TheSomething {
    public static String Title;
    public static String Description;
    public static String HowIsIt;
    public static int TimesSeenCount;
    public static List<Long> PeopleWhoSawIt;
    public static List<Session> PeopleSeeingIt;

    // now some math mumbo jumbo just to increase the memsize of this:
    public static double posX;
    public static double posY
    public static double posZ;
    public static double velX;
    public static double velY;
    public static double velZ;
    public static double accX;
    public static double accY;
    public static double accZ;
    public static double rotX;
    public static double rotY;
    public static double rotZ;
    public static double rotVelX;
    public static double rotVelY;
    public static double rotVelZ;
    public static double rotAccX;
    public static double rotAccY;
    public static double rotAccZ;
    public static List<Vertex> Geometry;
}
方法2

public static class TheSomething {
    private static TheSomething _instance;
    public static Instance { 
        get {
            if(_instance == null)
                _instance = new TheSomething();
        } private set {
            _instance = value;
        }
    }
    private TheSomething() {}
    public String Title;
    public String Description;
    public String HowIsIt;
    public int TimesSeenCount;
    public List<Long> PeopleWhoSawIt;
    public List<Session> PeopleSeeingIt;

    // now some math mumbo jumbo just to increase the memsize of this:
    public double posX;
    public double posY
    public double posZ;
    public double velX;
    public double velY;
    public double velZ;
    public double accX;
    public double accY;
    public double accZ;
    public double rotX;
    public double rotY;
    public double rotZ;
    public double rotVelX;
    public double rotVelY;
    public double rotVelZ;
    public double rotAccX;
    public double rotAccY;
    public double rotAccZ;
    public List<Vertex> Geometry;
}

就性能而言,这两个选项都不会为您带来实质性的改进。它们属于微观优化的范围,在现实场景中不会产生太大(如果有的话)差异

从设计角度来看,这两种选择都很糟糕,第一种选择尤其糟糕。一般来说,单例模式是不受欢迎的,因为开发人员倾向于滥用和忽略与之相关的各种副作用,如保留内存或资源或缺乏多线程支持


如果您仍然需要该类的单个实例,请尝试使用依赖项注入容器,而不是将该类本身设计为单个实例。

这是一个非常复杂的问题,我的答案将重复比我聪明的人已经说过的话。请阅读SO champion Jon Skeet的这篇文章。只有在与实际场景类似的现实条件下运行有效的性能测试,您才能回答“是否更快”。您的示例没有多大意义(增加
List
?)的一个实例),但如果有什么不同的话,我希望静态类比singleton更快(可能是一些无关紧要的,甚至是不可测量的数量)。充其量,这里的问题过于宽泛,最坏的情况下,没有足够的信息让任何人回答你的特定场景。是的,我最终需要一些类来“只执行一些东西”或“只存储这一条全球使用的信息”,比如System。例如,Convert,但我可能还需要在这些类中存储一些值,以便这两个示例都适合于此目的。假设没有性能差异,那么我会假设第一个模型(通常甚至由框架本身使用)似乎更适合。并同意我看不到使用singleton的好理由。谢谢你的信息,期待依赖注入模式。
public static class TheSomething {
    private static TheSomething _instance;
    public static Instance { 
        get {
            if(_instance == null)
                _instance = new TheSomething();
        } private set {
            _instance = value;
        }
    }
    private TheSomething() {}
    public String Title;
    public String Description;
    public String HowIsIt;
    public int TimesSeenCount;
    public List<Long> PeopleWhoSawIt;
    public List<Session> PeopleSeeingIt;

    // now some math mumbo jumbo just to increase the memsize of this:
    public double posX;
    public double posY
    public double posZ;
    public double velX;
    public double velY;
    public double velZ;
    public double accX;
    public double accY;
    public double accZ;
    public double rotX;
    public double rotY;
    public double rotZ;
    public double rotVelX;
    public double rotVelY;
    public double rotVelZ;
    public double rotAccX;
    public double rotAccY;
    public double rotAccZ;
    public List<Vertex> Geometry;
}
++TheSomething.Instance.PeopleWhoSawIt;