静态属性如何引用非静态方法?
示例:
public static int UserID
{
get
{
return GetUserID();
}
}
private int GetUserID()
{
return 1;
}
当我尝试编译它时,我得到错误:“非静态字段,方法或属性需要对象引用”GetUserID()“
答案 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
”实例。静态方法没有这样的实例,因此没有什么可以作为非静态方法的第一个隐藏参数。