【问题标题】:Static property references non-static method静态属性引用非静态方法
【发布时间】:2010-04-16 16:18:01
【问题描述】:

静态属性如何引用非静态方法?

例子:

public static int UserID
{
  get
  {
     return GetUserID();
  }
}

private int GetUserID()
{
  return 1;
}

当我尝试编译它时,我收到错误:“非静态字段、方法或属性“GetUserID()”需要对象引用

【问题讨论】:

  • 你需要一个非常好的理由来这样做......
  • 为什么UserID 是静态的?如果系统中只有一个用户,我会使用单例模式。

标签: c# static-methods


【解决方案1】:

这不起作用。

当您定义静态属性(或静态方法)时,您定义的属性适用于类type,而不是适用于该类的实例。

另一方面,实例属性和方法作用于类的特定构造实例。为了使用它们,您需要引用该特定实例。 (不过,反过来也可以。)

例如,想想 Fruit 和“Apple”类。假设苹果类有一个实例属性,即苹果此时的成熟程度。

你不会用“苹果”来形容它有多成熟,而是一个特定的“苹果”(实例)。另一方面,您可以有一个苹果的实例,并询问它是否包含种子(可能在 Apple 类本身上定义(静态))。

【讨论】:

  • 转基因无核苹果怎么样?
【解决方案2】:

您只需要创建一个新实例:

public static int UserID
{
  get
  {
    return new MyClass().GetUserID()     
  }
}

好吧,您不必每次调用 UserId 时都创建一个新实例——您可以使用包含 MyClass 实例的静态字段来代替(这当然是实现 @987654321 的一种方法@)。

虽然您可以读到您的静态属性正在调用一个可以设为静态的方法,但另一个方法不是静态的。因此,您必须在实例上调用该方法。

【讨论】:

  • 虽然技术上是正确的,但我要指出,这通常是一个很大的危险信号。构造一个新实例只是为了返回一个静态属性值的代码通常是一个真正糟糕的设计缺陷的标志......
【解决方案3】:

您需要以某种方式获取实例。没有实例,就无法调用实例方法。

对于您的情况,您确定需要 GetUserID() 作为实例方法吗?它无论如何都会返回相同的值。或者,如果您的代码只是虚拟代码,并且您需要在 GetUserID() 中添加更多逻辑,也许您可​​以告诉我们您打算做什么?

【讨论】:

    【解决方案4】:

    一种简单的思考方式如下:非静态方法(或属性,因为属性只是封装的方法)接收作为第一个隐藏参数的对它们操作的实例的引用(被调用方法中的“this”实例)。静态方法没有这样的实例,因此没有任何东西可以作为非静态方法的第一个隐藏参数。

    【讨论】:

      【解决方案5】:

      根本不可能。

      如果你需要调用静态方法来调用实例方法,可能你想要一个单例

      试试看: http://en.wikipedia.org/wiki/Singleton_pattern

      例子:

      public sealed class Singleton
      {
          private static readonly Singleton _instance = new Singleton();
      
          private Singleton() { }
      
          public static Singleton Instance
          {
              get
              {
                  return _instance;
              }
          }
      
          public static int UserID
          {
              get
              {
                  return _instance.GetUserID();
              }
          }
      
          private int GetUserID()
          {
              return 1;
          }
      
      }
      

      【讨论】:

        猜你喜欢
        • 2013-02-13
        • 1970-01-01
        • 2012-03-30
        • 2014-09-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-01-03
        • 2015-02-21
        相关资源
        最近更新 更多