什么是静态方法在非静态类的地步?(What is the point of a static met

2019-07-30 19:02发布

我听不太懂用下面的代码的基本错误:

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?

    }
}

我不能想到的一个原因,人们会在非静态类中声明一个静态方法,为什么会.NET不会抛出异常错误。

此外,

moc.print("vhhhat?");

这会说我不能在非静态上下文,但测试和主要都是静态访问静态方法,什么是它指的是?

Answer 1:

静态类意味着你不能在非静态环境中使用它,这意味着你不能有一个类的对象实例化和调用该方法。 如果你想用你的打印方法,你必须做的:

myOtherClass.print("vhhhat?");

这不是一成不变的,当你创建的类称为的一个实例moc

myOtherClass moc = new myOtherClass();


Answer 2:

这会说我不能在非静态上下文,但测试和主要都是静态访问静态方法,什么是它指的是?

这是指您正在使用引用的实例(MOC)一个静态方法(myOtherClass.print)的事实。 你将不得不返工这是:

myOtherClass.print("vhhhat?");

这将正确编译。

静态方法是在类本身,而不是类的特定实例的工作方法。 这有很多用途-一个例子是实现了工厂方法模式 。



Answer 3:

首先,错误:

moc.print("vhhhat?");

试图调用静态方法的类(即非静态上下文)的实例。 要正确调用print(),你会怎么做

myOtherClass.print("vhhhat?");

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



Answer 4:

有时该函数的“客观”是特定的类,而不是对象(类的实例)。

例如,工厂方法:

SomeClass obj = SomeClass.CreateInstance();

这是更加明显,当语言具有的元编程工具,允许类上操作。 在Python中,这种区别是按照约定更加明确:传递给函数的第一个参数是名为类似“CLS”或“自我”,并表示该功能可在类工作(当它是一个“类方法”)或实例(你比较习惯的类型,当它是一个实例方法)。



Answer 5:

下面是当你将使用在非静态类的静态方法一个很好的例子:

ASP.NET AJAX回调到Web方法在ASPX页面



Answer 6:

正确的程序是: -

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

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

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

        myOtherClass moc = new myOtherClass();
        myOtherClass.print("vhhhat?");
        moc.printMe("test me");


    }
}


Answer 7:

当您在一个对象实例调用方法,则需要在非静态上下文中调用它。 这是没有意义的哪种方法你做到这一点。



文章来源: What is the point of a static method in a non-static class?
标签: c# static scope