【问题标题】:Is there a way to call a non-static method from a static method?有没有办法从静态方法调用非静态方法?
【发布时间】:2013-04-01 01:52:53
【问题描述】:

这就是我所拥有的。

public static void Person_home_phone_TextChanged(object sender, EventArgs e) { ... }

有没有办法从这个静态方法内部访问同一个或另一个类的非静态方法?

我需要获取 Person_home_phone 文本框中的文本并将其保存到类数据成员中。

【问题讨论】:

  • 当然你可以从静态方法内部调用非静态方法。为什么你会认为你做不到? Main 是一个静态方法,所以显然你必须能够从静态方法调用非静态方法。
  • 只需将省略号 ... 替换为 sender.ToString();。由于ToString是一个非静态方法,你已经成功“访问”了一个!
  • 你的静态方法看起来像文本框上的事件处理程序,可能一开始就不需要是静态的
  • @JeppeStigNielsen 所以发件人包含TextBox.Text?谢谢。这就是我要找的。​​span>

标签: c# visual-studio-2012 static-methods non-static


【解决方案1】:

Example() -> 例子

您只需创建type 的实例,然后从static 方法调用non-static

public class Example(){

    public static void StaticExample()
    {

        Example example = new Example();
        example.NonStatic();
    }

    public void NonStatic()
    {

    }

}

【讨论】:

  • 如果类来自 System.Web.UI.Page 类型怎么办?或 System.Web.UI.UserControl?我们可以得到它的一个实例吗?
  • 假设被调用的方法归一个表单类所有,那就意味着每次调用该方法都必须实例化一个新的表单实例?
【解决方案2】:

您需要有一个类的实例才能调用非静态方法。

【讨论】:

    【解决方案3】:

    解决方案 #1: 每次调用该方法时实例化一个新的 Car 实例。

     public static void DoSomething()
            {
                Car c = new Car();
                c.NonStaticMethod();
            }
    

    解决方案 #2: 将 Car 传递给方法。

     public static void DoSomething(Car c)
            {
                c.NonStaticMethod();
            }
    

    解决方案 #3:

    使用单例 Car 来支持静态方法。 (如果有可能从多个线程调用,您可能还需要锁定。请注意 System.Windows.Forms.Timer 不会引入线程。)

     public class Car
        {
            private static Car m_Singleton = new Car();
    
            public static void DoSomething()
            {
                m_Singleton.NonStaticMethod();
            } 
    

    请注意,您没有解释 Timer 的内存问题。很有可能有解决这个潜在问题的方法。

    【讨论】:

      【解决方案4】:

      实例方法(vel. non-static)只能在该类的实例的上下文中调用。所以你可以调用它,但你必须在你的静态方法的某个地方有一个该类的对象。

      【讨论】:

        【解决方案5】:

        非静态方法需要类的实例。除非您传入了一个实例,或者在您的方法中创建了一个实例,否则您不能调用非静态方法,因为您不知道该方法应该操作的类的哪个实例。

        你需要一个类的实例来调用非静态方法。

        【讨论】:

          猜你喜欢
          • 2013-11-28
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-10-04
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-03-20
          相关资源
          最近更新 更多