静态属性引用非静态方法

时间:2010-04-16 16:18:02

标签: c# static-methods

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

示例:

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

private int GetUserID()
{
  return 1;
}

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

5 个答案:

答案 0 :(得分:11)

这不起作用。

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

另一方面,实例属性和方法适用于特定的,构造的类实例。要使用它们,您需要引用该特定实例。 (反过来说,没问题。)

举个例子,想想Fruit和一个“Apple”课程。假设苹果类具有一个实例属性,这个属性是Apple此时的成熟程度。

你不会像苹果那样描述它的成熟程度,而是描述一个特定的“苹果”(实例)。另一方面,您可以拥有一个苹果实例,并询问它是否包含种子(可能在Apple类本身上定义(静态))。

答案 1 :(得分:2)

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

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

那么,每次调用UserId时都不必创建新实例 - 您可以使用包含MyClass实例的静态字段(当然这是一种方法)实施the Singleton pattern)。

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

答案 2 :(得分:1)

你需要以某种方式获得一个实例。没有实例,就不可能调用实例方法。

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

答案 3 :(得分:0)

简直不能。

如果需要调用静态方法来调用实例方法,可能需要Singleton

试试看: 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;
    }

}

答案 4 :(得分:0)

考虑它的一个简单方法如下:非静态方法(或属性,因为属性只是被包装的方法)作为第一个隐藏参数接收对它们运行的​​实例的引用(被调用方法中的“this”实例。静态方法没有这样的实例,因此没有什么可以作为非静态方法的第一个隐藏参数。