具有静态方法的C#类实例与静态类内存使用情况

jtb*_*jtb 21 c# static-methods memory-management

在这两种情况之间,C#或其他语言如何处理内存分配(和内存解除分配):

1.)调用静态类的方法.

public Program {
    Foo foo = Loader.load();
}

public static Loader {
    public static Foo load() {
        return new Foo();
    }
}
Run Code Online (Sandbox Code Playgroud)

2.)在一个实例上调用一个方法,然后该方法超出范围.

public Program {
    Foo foo = new Loader().load();
}

public Loader {
    public Foo load() {
        return new Foo();
    }
}
Run Code Online (Sandbox Code Playgroud)

我想静态类在内存中被加载并保留; 而C#的闲暇时,类实例屈服于垃圾收集.这两种范式是否存在任何利弊?有没有时间你有一个永远不需要实例化的类(即某种资源加载器或工厂),但你还是使用第二种方法来利用垃圾收集?

我的问题的重要部分是,第一范式是否在某些情况下在概念上是正确的,可能会遭受不必要的记忆.

Guf*_*ffa 9

你的第二个例子不起作用,所以让我们探索真正的选择:

1.)调用静态类的方法.

public Program {
   Foo foo = Loader.Load();
}

public static Loader {
   public static Foo Load() {
      return new Foo();
   }
}
Run Code Online (Sandbox Code Playgroud)

2.)调用非静态类中的静态方法.

public Program {
   Foo foo = Loader.Load();
}

public Loader {
   public static Foo Load() {
      return new Foo();
   }
}
Run Code Online (Sandbox Code Playgroud)

3.)在实例上调用实例方法

public Program {
   Foo foo = new Loader().Load();
}

public Loader {
   public Foo Load() {
      return new Foo();
   }
}
Run Code Online (Sandbox Code Playgroud)

两者首先是相同的.无论该类是否为静态,调用静态方法都是相同的.

第三个选项将在堆上创建类的实例.由于该类没有数据成员,因此它只有16个字节.它最终将被垃圾收集,但由于体积小,发生这种情况时并不重要.

调用实例方法与静态方法略有不同.将发送对类实例的引用,您可以通过该this关键字进行访问.在这种情况下几乎没有区别,因为要访问的对象中没有真实数据.