2010-04-16 54 views
2

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

实施例:

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

private int GetUserID() 
{ 
    return 1; 
} 

当我尝试编译此,我得到错误:“是必需的,因为他非静态字段,方法或属性的对象引用‘GetUserID()’

+1

你需要一个很好的理由来做到这一点...... – cjk 2010-04-16 16:21:10

+0

为什么UserID是静态的?如果系统中只有一个用户,我会使用单例模式。 – 2010-04-16 16:21:22

回答

11

这不起作用。

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

另一方面,实例属性和方法对类的特定构造实例起作用。为了使用它们,您需要具有对特定实例的引用。 (但是,其他方法很好。)

作为示例,请考虑Fruit和“Apple”类。说苹果类有一个实例属性,这是苹果在这个时候的成熟程度。

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

+1

转基因无核苹果怎么样? – Jake 2010-04-16 18:45:11

+0

嗯,好吃。子类它! – 2010-04-16 18:57:59

2

你只需要创建一个新的实例:

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

那么,你不必创建一个新的实例每次UserId被称为 - 你可以有一个包含一个静态字段代替MyClass的实例(当然这将是实施the Singleton pattern的方法)。

虽然你可以阅读你的静态属性正在调用可以作出静态的方法,另一种方法静态的。因此,您必须在实例上调用该方法。

+2

虽然技术上正确,但我会指出,这通常是一个大红旗。构建新实例的代码只是为了返回一个静态属性值,通常是一个真正糟糕的设计缺陷的标志... – 2010-04-16 16:24:05

1

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

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

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; 
    } 

} 
0

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

相关问题