在非静态类中调用静态方法时是否会实例化类?

2023-12-31

到底发生了什么Foo.SomeCheck()被称为在Bar班级?是一个实例Foo创建是为了调用一些检查()?如果是,该实例是否存储在堆上,是否通过垃圾回收进行收集?

public class Foo() {
    public static bool SomeCheck() {
        return true;
    }
}

public class Bar() {
    public void SomeMethod() {
        // what happens when we access Foo to call SomeCheck?
        if (Foo.SomeCheck()) {
            //do something
        }
    }
}

静态方法与实例方法的不同之处在于没有实例需要创建它们所属类的名称才能调用它们。当您调用静态方法时,实际上是使用类型名称而不是类型的实例 - 这应该强化静态方法不会在实例上调用的想法。这值得重复和强调: 不需要类的实例来调用该类的公共静态方法。

现在,您的示例格式错误,但大概行:if( Foo.SomeCheck() )正在呼叫SomeCheck使用类型名称的静态方法:Foo——不是个例。但是,必须实例化 Bar 才能进行此调用- 但是,在您的示例中,您没有格式良好的实例Bar。代码通常必须存在于方法(或成员初始值设定项)内 - 此处没有。

回答你问题的其他部分。假设有问题的代码是实例方法的一部分,则必须实例化某些内容Bar- 并调用该方法。那某物必须创建或以其他方式获取一个实例Bar。引用类型将始终在堆上创建 - 但这在这里基本上无关紧要。

至于垃圾收集,您通常不必担心这一点。 .NET 运行时确保清理未从程序中的任何根对象引用的实例。根通常是驻留在调用堆栈上某处的实例,或者由一种或另一种类型的静态成员引用的实例。因为我们在这里没有看到任何创建或引用的代码Bar不可能说when它将被收集。例如,如果Bar是一个单例并存储在静态变量中的某个位置,它可能会存在很长一段时间 - 也许是程序的整个生命周期。不亲眼所见你无法真正了解all操作和管理的代码Bar.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在非静态类中调用静态方法时是否会实例化类? 的相关文章

随机推荐