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

Mos*_*she 172 c# methods static

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

public static void doSomething(){
   //Well, do something!
}
Run Code Online (Sandbox Code Playgroud)

你能把static关键字添加到课堂吗?那意味着什么?

SLa*_*aks 303

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

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

例如:

class SomeClass {
    public int InstanceMethod() { return 1; }
    public static int StaticMethod() { return 42; }
}
Run Code Online (Sandbox Code Playgroud)

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

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

SomeClass.InstanceMethod();  //Won't compile
SomeClass.StaticMethod();    //Fine
Run Code Online (Sandbox Code Playgroud)

  • 那么它就像一个类方法而不是实例方法? (26认同)
  • @Moshe:没错.使用静态方法,您不需要类的实例来调用方法,只需要类. (4认同)
  • 但实际上是否有某种技术限制阻止在实例上调用静态方法?如果编译器允许它,它可以被访问的危险是什么? (3认同)
  • @kroon:没有任何意义.实例方法实际上只是将实例作为隐藏的第一个参数.静态方法没有.请参阅我的博客文章:http://blog.slaks.net/2011/06/open-delegates-vs-closed-delegates.html (2认同)

Beh*_*ati 26

从另一个角度来看:考虑您想对单个String进行一些更改.例如,你想使字母大写,等等.为这些操作创建另一个名为"Tools"的类.没有制作"工具"类实例的意义,因为该类中没有任何实体可用(与"人"或"教师"类相比).所以我们使用静态关键字来使用"工具"类而不做任何实例,当你按类名后面的点("工具")时,你可以访问你想要的方法.

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();

    }
}
}
Run Code Online (Sandbox Code Playgroud)


Alb*_*orz 13

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


mih*_*mih 5

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

静态类意味着该类仅包含静态成员.


r.m*_*nov 5

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

static class myStaticClass
{
    public static void someFunction()
    { /* */ }
}
Run Code Online (Sandbox Code Playgroud)

您不能这样:

myStaticClass msc = new myStaticClass();  // it will cause an error
Run Code Online (Sandbox Code Playgroud)

您只能进行:

myStaticClass.someFunction();
Run Code Online (Sandbox Code Playgroud)