关于静态行为

时间:2011-07-08 09:00:35

标签: c#

从静态函数

我们可以创建一个实例,但我们无法访问任何非静态数据成员....为什么。

public static DropoffType DROP_BOX
        {
            get
            {
                DropoffType tempType = new DropoffType();
                tempType.DropoffTypeSelected = _DROP_BOX;
                y=11; // compile time error
                return tempType;
            }
        }

从上面的代码我们可以看到实例可以从属性创建,但是当我们尝试访问任何非静态数据成员时,我得到了complile time error。任何人都可以详细解释为什么可以从任何地方创建实例,但非静态数据成员无法从静态函数访问。

4 个答案:

答案 0 :(得分:3)

如果y是一个实例字段,则无法在不告诉 哪个对象 的情况下访问它。对于实例成员,存在隐式this.,即this.y

只需添加:

tempType.y = 11;

问题是,你可以使用任意数量的变量和对象。即使对于实例方法,您也经常需要消除歧义,即

public int CompareTo(Foo other) {
    return string.Compare(this.Bar, other.Bar);
}

(在上文中this.并非严格需要,但有助于读者IMO; other.是完全必要的)

答案 1 :(得分:2)

您可以从静态成员访问实例成员 - 只要您指定要谈论的实例。

假设y是DROP_BOX属性的包含类的类型中的实例变量(顺便说一句讨厌属性名称), 实例会指望它改变状态?

请记住,实例成员与该类型的特定实例相关,而静态成员与类型本身相关,而不是与特定实例相关。

如果你能提供一个更完整的例子来解决你遇到的问题,我们可能会提供更多帮助。

有关详细信息,请参阅my answer to a similar question yesterday

答案 2 :(得分:1)

因为静态函数没有绑定到特定的对象实例。

答案 3 :(得分:1)

静态函数只能访问静态成员,因为您可以创建任意数量的对象,静态成员不属于实例,而属于类。

说你做

var x1 = new DropoffType();
var x2 = new DropoffType();

DropoffType.SomeStaticFunction();

并且静态函数设置y = 11。哪个对象应该获得您设置的状态?没有?所有?最后一个?第一个?