代码之家  ›  专栏  ›  技术社区  ›  Ian R. O'Brien Mamedov

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

  •  11
  • Ian R. O'Brien Mamedov  · 技术社区  · 14 年前

    什么时候会发生 被称为 酒吧 创建以调用 SomeCheck()

    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
            }
        }
    }
    
    5 回复  |  直到 14 年前
        1
  •  7
  •   LBushkin    14 年前

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

    线路: if( Foo.SomeCheck() ) 正在呼叫 SomeCheck 使用类型名称的静态方法: Foo -不是一个实例。 - 但是,在您的示例中,没有格式良好的 Bar

    回答你问题的其他部分。假设所讨论的代码是实例方法的一部分,则必须实例化某些内容 酒吧 -并调用该方法。那个 某物 必须创建或以其他方式获取 . 引用类型将总是在堆上被信任,但这在这里基本上是不相关的。

    酒吧 很难说 它将被收集。例如,如果 是一个单例,并且存储在一个静态变量的某个地方,它可能会存在很长的时间——可能是整个程序的生命周期。你不看就不可能真正知道 操作和管理的代码 酒吧

        2
  •  3
  •   jrista    14 年前

    我强烈建议您阅读以下文章:

    Drill Into .NET Framework Internals to See How the CLR Creates Runtime Objects

    它解释了.NET运行时如何在较低级别上工作,并解释了加载程序堆等内部细微差别以及静态类/成员如何工作。从技术上讲,类静态成员的“static instnace”有一个初始实例化。但是,运行时处理此初始化的方式与处理类实例的方式不同。静态类存储在加载程序堆上,这些堆不是GC管理的。装载机堆是以静态方式分配和增长的,不会被压缩。这篇文章读得很好,应该能让你对CLR的工作原理有一个深入的了解。

        3
  •  1
  •   Will Marcouiller    14 年前

    Foo 不需要实例化,也不会在 SomeCheck 静态方法调用根据结果,您将获得方法本身返回的值,而不是类的实例。

    1. Static vs Non-Static Methods ;
    2. Static Classes and Static Class Members (C# Programming Guide) .

    我真希望这有帮助!=)

        4
  •  0
  •   Seb Charrot    14 年前

    SomeMethod . 该方法必须从某个地方调用,可能是一个“driver”类,它将实例化Bar并调用 某种方法 . 例如:

    public class Driver
    {
        public static void Main()
        {
            Bar bar = new Bar();
            bar.SomeMethod();
        }
    }
    

    考虑到你目前执行的 ,是的,您必须实例化它。

    但是,只要 只调用另一个静态方法,我们就可以

    public class Driver
    {
        public static void Main()
        {
            Bar.SomeMethod();
        }
    }
    
        5
  •  0
  •   Chaitanya    14 年前
    public class Manipulate
        {        
            public static int Main(string[] args) {
                Bar bar = new Bar();
                bar.BarFoo();
                Console.ReadKey();
                return 0;
            }
    
        }
        public class Foo {
            public static bool SomeCheck() {
                return true;
            }
        }
        public class Bar {
            // what happens when we access Foo to call SomeCheck?
            public void BarFoo() {
                if (Foo.SomeCheck()) {
                    Console.WriteLine("Hello am true");
                }
            }
        }
    

    是的,您需要创建一个Bar的实例,但不能为Foo类创建,因为它是一个静态metod。唯一的区别是,静态方法是在类级别(编译时)而不是对象级别(运行时)调用的,所以不需要实例化Foo类。