静态属性如何引用非静态方法?静态属性引用非静态方法
实施例:
public static int UserID
{
get
{
return GetUserID();
}
}
private int GetUserID()
{
return 1;
}
当我尝试编译此,我得到错误:“是必需的,因为他非静态字段,方法或属性的对象引用‘GetUserID()’
静态属性如何引用非静态方法?静态属性引用非静态方法
实施例:
public static int UserID
{
get
{
return GetUserID();
}
}
private int GetUserID()
{
return 1;
}
当我尝试编译此,我得到错误:“是必需的,因为他非静态字段,方法或属性的对象引用‘GetUserID()’
这不起作用。
当您定义静态属性(或静态方法)时,您正在定义一个属性,该属性适用于类类型,而不是类的实例。
另一方面,实例属性和方法对类的特定构造实例起作用。为了使用它们,您需要具有对特定实例的引用。 (但是,其他方法很好。)
作为示例,请考虑Fruit和“Apple”类。说苹果类有一个实例属性,这是苹果在这个时候的成熟程度。
你不会像“苹果”那样描述它是多么成熟,而是一个特定的“苹果”(实例)。另一方面,你可以拥有一个苹果的实例,并询问它是否包含种子(可以在Apple类本身定义(静态))。
转基因无核苹果怎么样? – Jake 2010-04-16 18:45:11
嗯,好吃。子类它! – 2010-04-16 18:57:59
你只需要创建一个新的实例:
public static int UserID
{
get
{
return new MyClass().GetUserID()
}
}
那么,你不必创建一个新的实例每次UserId
被称为 - 你可以有一个包含一个静态字段代替MyClass
的实例(当然这将是实施the Singleton pattern的方法)。
虽然你可以阅读你的静态属性正在调用可以作出静态的方法,另一种方法不静态的。因此,您必须在实例上调用该方法。
虽然技术上正确,但我会指出,这通常是一个大红旗。构建新实例的代码只是为了返回一个静态属性值,通常是一个真正糟糕的设计缺陷的标志... – 2010-04-16 16:24:05
你需要某种方式来获得一个实例。没有实例,就不可能调用实例方法。
对于您的情况,您确定需要GetUserID()
作为实例方法吗?无论如何它返回相同的值。或者,如果你的代码只是虚拟的,并且你需要更多逻辑GetUserID()
,也许你可以告诉我们你打算做什么?
只是它不能。
如果您需要调用一个静态方法来调用一个实例方法,也许你想要一个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;
}
}
的一种简单方法考虑下面的内容:一个非静态的方法(或属性,因为属性只是包装的方法)接收到它们作为第一个隐藏参数的实例的引用(“this
“实例在被调用的方法中)。静态方法没有这样的实例,因此没有什么可以作为非静态方法的第一个隐藏参数。
你需要一个很好的理由来做到这一点...... – cjk 2010-04-16 16:21:10
为什么UserID是静态的?如果系统中只有一个用户,我会使用单例模式。 – 2010-04-16 16:21:22