Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/327.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如果我在C#中创建一个静态类,那么内部的任何方法都会被视为静态的吗,不管它们是否';重新显式声明为静态?_C#_Static_Static Methods - Fatal编程技术网

如果我在C#中创建一个静态类,那么内部的任何方法都会被视为静态的吗,不管它们是否';重新显式声明为静态?

如果我在C#中创建一个静态类,那么内部的任何方法都会被视为静态的吗,不管它们是否';重新显式声明为静态?,c#,static,static-methods,C#,Static,Static Methods,可能重复: 我得到了一个有趣的错误,当我从一个静态声明的类中调用一个方法(我没有显式声明为静态)时,我得到一条消息说 非静态字段、方法或属性“MangoTree.Twitter.OAuthClient.PerformRequest(System.Collections.Generic.Dictionary,string,string,MangoTree.Twitter.OAuthClient.RequestType)”需要对象引用 当我显式地将方法声明为static时,错误就会消失,我可以从类

可能重复:

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

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


当我显式地将方法声明为static时,错误就会消失,我可以从类声明中删除static修饰符,错误就会消失。让我困惑的是,我当时的印象是,当我将类声明为静态时,类中的所有内容都应该自动也是静态的,而不必显式声明。

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

例如:

static class CompanyInfo
{
    public static string GetCompanyName() { return "CompanyName"; }
    public static string GetCompanyAddress() { return "CompanyAddress"; }
    //...
}

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

请阅读本文了解原因


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

但是,如果您的类是非静态的,并且有两个方法,其中一个是静态的,那么您可以像下面这样在静态函数中调用非静态成员函数

public class Foo
{
    public void Test()
    {
    }

    public static void Test1()
    {
         Foo foo = new Foo();
         foo.Test1();
    }
}
因为静态成员和类在实例化普通类之前就已经实例化了,所以静态函数不会知道普通函数的存在

在第二种情况下,由于两个函数都声明为静态,因此没有问题

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

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

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

复制了Eric的一个伟大答案。。。。