将static关键字添加到方法中是什么意思?

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


可以将static关键字添加到类中吗?那是什么意思?

评论

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

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

#1 楼

一个static函数与常规(实例)函数不同,它不与该类的实例相关联。

static类是只能包含static成员的类,因此无法实例化。 br />
例如:

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


评论


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

– Moshe
2010年11月8日13:12

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

–二进制担忧者
2010年11月8日,13:14

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

–kroonwijk
2011年9月12日在19:09

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

–SL
2011年9月12日在20:28

其中“ StaticMethod”是类方法,“ InstanceMethod”是SomeClass类的实例方法

–Usman Younas
15年1月15日在22:39

#2 楼

从另一个角度来看:
考虑要对单个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();

    }
}
}


评论


使用“对字符串进行更改”是一个不好的例子-字符串是不可变的,不能更改。但是,否则,解释是有意义的(用非不变类替换字符串)

–Flydog57
19年2月8日在22:41

#3 楼

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

#4 楼

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

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

#5 楼

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

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


您不能这样:

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


您只能制作:

myStaticClass.someFunction();


#6 楼

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

#7 楼

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

#8 楼

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

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

#9 楼

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

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

有关如何,何时执行的详细说明在哪里看到MSDN

评论


不,静态类永远不会实例化。鉴于其中的所有内容都是静态的,您为什么要实例化它?

–乔恩·斯基特(Jon Skeet)
2010年11月8日,13:17

静态类根本没有实例。

–SL
2010年11月8日,13:17

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

–戴夫·阿克利
2010年11月8日13:57

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

– mccainz
13年5月21日在19:50

可以将一个类声明为静态类,表明它仅包含静态成员。使用new关键字无法创建静态类的实例。加载包含静态类的程序或名称空间时,静态类将由.NET Framework公共语言运行时(CLR)自动加载。

– Satheesh
2014年9月3日在18:16