public static void doSomething(){
//Well, do something!
}
可以将
static
关键字添加到类中吗?那是什么意思?#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
评论
您可以仅通过class_name.static_method_name();使用静态方法而无需创建该类的实例;在编程级别,我们感到无需创建类/类型的实例就可以调用静态方法。内部情况并非如此。 CLR在内部管理一个称为类型实例的特殊实例,用于管理对静态方法的调用。请参阅此答案。真有趣。