3

可能重复:
C#.NET - 为什么需要将静态类的成员声明为静态?为什么它不只是隐含的?

我收到一个有趣的错误,当我从静态声明的类中调用一个方法(我没有明确声明为静态)时,我收到一条消息说

非静态字段、方法或属性“MangoTree.Twitter.OAuthClient.PerformRequest(System.Collections.Generic.Dictionary, string, string, string, MangoTree.Twitter.OAuthClient.RequestType)”需要对象引用

当我将方法显式声明为静态时,错误就消失了,我可以从类声明中删除静态修饰符,错误就消失了。令我困惑的是,我的印象是,当我将类声明为静态时,类中的所有内容也应该自动成为静态的,而无需我显式声明它。

4

5 回答 5

4

令我困惑的是,我的印象是,当我将类声明为静态时,类中的所有内容也应该自动成为静态的

静态类的所有成员都必须是静态的,但它不会自动发生:您必须显式声明所有成员为静态的。声明类静态的目的是让编译器检查所​​有成员都是静态的,并防止任何尝试创建静态类的实例。

于 2012-07-13T04:49:46.000 回答
1

静态类的所有成员都必须是静态的。

为什么请阅读这篇文章?

http://www.codeproject.com/Articles/15269/Static-Keyword-Demystified

于 2012-07-13T04:47:31.047 回答
0

如果你在 C# 中创建一个静态类,里面的方法需要声明为静态的:

http://msdn.microsoft.com/en-us/library/79b3xss3(v=vs.80).aspx

例子:

static class CompanyInfo
{
    public static string GetCompanyName() { return "CompanyName"; }
    public static string GetCompanyAddress() { return "CompanyAddress"; }
    //...
}
于 2012-07-13T04:46:32.993 回答
0

如果不创建类的实例,就不能调用非静态成员函数。因此,在第一种情况下,由于无法实例化静态类,因此在尝试从静态函数调用非静态函数时会出现错误。

但是,如果您的类是非静态的并且有两种方法,其中一种是静态的,您可以像这样在静态函数中很好地调用非静态成员函数

public class Foo
{
    public void Test()
    {
    }

    public static void Test1()
    {
         Foo foo = new Foo();
         foo.Test1();
    }
}

由于静态成员和类在实例化普通类之前就已经实例化,静态函数将不知道普通函数的存在。

在第二种情况下,因为这两个函数都被声明为静态的,所以没有问题。

于 2012-07-13T04:48:25.350 回答
0

C# 编译器将静态类标记为“密封抽象”,因此您永远无法实例化静态类或从静态类继承。因此,在静态类中定义非静态成员没有实际价值,因为您将永远无法实例化该类,因此永远无法调用非静态成员。所以你必须在静态类中只定义静态成员。天气一个类是否应该是静态的是设计设计决定。

于 2012-07-13T04:53:23.447 回答