非静态类中的静态方法有什么意义?

Mat*_*att 30 c# static scope

我无法通过以下代码了解潜在的错误:

class myClass
{
    public void print(string mess)
    {
        Console.WriteLine(mess);
    }
}

class myOtherClass
{
    public static void print(string mess)
    {
        Console.WriteLine(mess);
    }
}

public static class Test
{
    public static void Main()
    {
        myClass mc = new myClass();
        mc.print("hello");

        myOtherClass moc = new myOtherClass();
        moc.print("vhhhat?"); 
       //This says I can't access static method in non static context, but am I not?

    }
}
Run Code Online (Sandbox Code Playgroud)

我无法想到为什么会在非静态类中声明静态方法的原因,那么为什么.NET不会抛出异常错误.

此外,

moc.print("vhhhat?");
Run Code Online (Sandbox Code Playgroud)

这将说我无法在非静态上下文中访问静态方法,但Test和main是静态的,它指的是什么?

Alb*_*oPL 22

静态类意味着您不能在非静态上下文中使用它,这意味着您不能拥有该类的对象实例化并调用该方法.如果你想使用你的打印方法,你必须这样做:

myOtherClass.print("vhhhat?");
Run Code Online (Sandbox Code Playgroud)

这不是静态的,因为您创建了一个名为的类的实例化moc:

myOtherClass moc = new myOtherClass();
Run Code Online (Sandbox Code Playgroud)


Ree*_*sey 12

这将说我无法在非静态上下文中访问静态方法,但Test和main是静态的,它指的是什么?

这是指您使用实例(moc)引用静态方法(myOtherClass.print)的事实.你必须重做这个:

myOtherClass.print("vhhhat?");
Run Code Online (Sandbox Code Playgroud)

这将正确编译.

静态方法是对类本身起作用的方法,而不是类的特定实例.这有很多用途 - 一个例子是实现Factory方法模式.


Sea*_*ean 11

一,错误:

moc.print("vhhhat?");
Run Code Online (Sandbox Code Playgroud)

试图在类的实例上调用静态方法(即非静态上下文).要正确调用print(),你会这样做

myOtherClass.print("vhhhat?");
Run Code Online (Sandbox Code Playgroud)

对于第一个问题,有很多理由在非静态类中使用静态方法.基本上,如果存在与该类关联的操作,但没有与该类的任何特定实例相关联,则它应该是静态方法.例如,String.Format()(或任何String静态方法)不应对字符串实例进行操作,但它们应与String类关联.因此它们是静态的.

  • String.Format() 的优秀示例 (2认同)