C#中的“静态方法”是什么?


177

将static关键字添加到方法中意味着什么?

public static void doSomething(){
   //Well, do something!
}

您可以在static课程中添加关键字吗?那是什么意思呢?


9
您可以仅通过class_name.static_method_name();使用静态方法而无需创建该类的实例。
Javed Akram 2010年

在编程级别,我们感到无需创建类/类型的实例就可以调用静态方法。内部情况并非如此。CLR在内部管理一个称为类型实例的特殊实例,用于管理对静态方法的调用。请参阅答案。真有趣。
RBT

Answers:


313

static功能,不像常规的(例如)函数,不与类的实例相关联。

一个 static类是一类只能包含static成员,并且因此不能被实例化。

例如:

class SomeClass {
    public int InstanceMethod() { return 1; }
    public static int StaticMethod() { return 42; }
}

为了调用InstanceMethod,您需要一个类的实例:

SomeClass instance = new SomeClass();
instance.InstanceMethod();   //Fine
instance.StaticMethod();     //Won't compile

SomeClass.InstanceMethod();  //Won't compile
SomeClass.StaticMethod();    //Fine

28
所以这就像一个类方法而不是实例方法?
Moshe

4
@Moshe:是的。使用静态方法,您不需要类的实例来调用该方法,只需要类即可。
Binary Worrier,2010年

3
但是实际上是否存在某种技术限制,无法在实例上调用静态方法?如果编译器允许,则可访问它的危险是什么?
kroonwijk

2
@kroon:这没有任何意义。实例方法实际上只是将实例作为隐藏的第一个参数。静态方法没有。请参阅我的博客文章:blog.slaks.net/2011/06/open-delegates-vs-closed-delegates.html
SLaks 2011年

其中“ StaticMethod”是类方法,“ InstanceMethod”是类SomeClass的实例方法
Usman Younas 2015年

26

从另一个角度来看:考虑要对单个String进行一些更改。例如,您要将字母大写,等等。您为这些操作创建了另一个名为“工具”的类。制作“工具”类的实例没有任何意义,因为该类内部没有任何类型的实体(与“人”或“教师”类相比)。因此,为了使用“工具”类而不使用其任何实例,我们使用了静态关键字,当您在类名(“工具”)后按点时,便可以访问所需的方法。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApplication1
{
class Program
{
    static void Main(string[] args)
    {
        Console.WriteLine(Tools.ToUpperCase("Behnoud Sherafati"));
        Console.ReadKey();
    }
}

public static class Tools
{
    public static string ToUpperCase(string str)
    {
        return str.ToUpper();

    }
}
}

1
使用“对字符串进行更改”是一个不好的例子-字符串是不可变的,不能更改。但是,否则,这种解释是有道理的(将不可
更改的

13

即使没有创建该类的实例,也可以在该类上调用静态方法,字段,属性或事件。如果创建了该类的任何实例,则不能使用它们访问静态成员。仅存在静态字段和事件的一个副本,并且静态方法和属性只能访问静态字段和静态事件。静态成员通常用于表示不会随对象状态而变化的数据或计算。例如,数学库可能包含用于计算正弦和余弦的静态方法。静态类成员是使用static关键字声明的,然后再返回内存类型


5

静态函数意味着它与类相关联(不是类的特定实例,而是类本身),即使没有类实例也可以调用它。

静态类表示该类仅包含静态成员。


5

不久,您无法实例化静态类:例如:

static class myStaticClass
{
    public static void someFunction()
    { /* */ }
}

您不能这样:

myStaticClass msc = new myStaticClass();  // it will cause an error

您只能进行以下操作:

myStaticClass.someFunction();

0

当您向方法中添加“静态”关键字时,这意味着基础实现为该类的任何实例提供相同的结果。不用说,结果随参数值的变化而变化


-1

静态变量不与该类的对象链接。可以使用类名进行访问。该类的所有对象将共享静态变量。

通过将函数设为静态,它将限制该函数在该文件中的访问。


-1

static关键字的核心,您将在此RAM(方法/ variable / class)中只有一个副本,该副本可为所有调用共享


-8

当将static关键字应用于类时,它告诉编译器创建该类的单个实例。这样就不可能“新建”该类的一个或多个实例。静态类中的所有方法本身必须声明为静态。

具有非静态类的静态方法是可能的,而且通常是合乎需要的。例如,工厂方法在创建另一个类的实例时经常被声明为静态,因为这意味着不需要包含factor方法的类的特定实例。

有关如何,何时何地在何处的良好解释,请参见MSDN。


8
不,静态类永远不会实例化。鉴于其中的所有内容都是静态的,您为什么实例化它?
乔恩·斯基特

1
一个static类根本没有实例。
SLaks

4
抱歉,我听不懂...我说创建了一个实例,您不能再新建一个。当然可以创建一个静态实例,否则该代码将无法调用?
戴夫·阿克利

2
静态类确实有一个实例,实际上是两个,它们不是TheType的实例。静态类将作为[Foo] Type对象(JIT的方法查找表等)存在于堆上,并且将使用特殊的System.Type对象进行初始化。
mccainz

可以将一个类声明为静态类,表明它仅包含静态成员。使用new关键字无法创建静态类的实例。加载包含静态类的程序或名称空间时,静态类将由.NET Framework公共语言运行时(CLR)自动加载。
Satheesh 2014年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.