公共方法 vs 公共静态方法

5
阅读了C#编程教程中的访问修饰符之后,我得出结论,只需将方法定义为public就足以使其从同一命名空间的另一个Form中“看到”。
但在实践中,每当我尝试实现这一点时,我还必须将该方法定义为static,以便它可以从同一命名空间的其他Form中进行引用。
我有什么遗漏吗?我做错了什么吗?

你是否创建了包含该方法的类的实例?该类是否也被标记为静态?请贴上一些代码。 - DGibbs
可能是何时应使用public/private/static方法?的重复问题。 - Ashraf Sada
2个回答

7
对于一个public static方法,您不需要引用对象。该方法是静态的,可以在class级别上访问。
如果您无法访问公共方法,则需要引用对象,然后才能访问。
public class AClass
{
    public void DoSomething() {}
    public static void DoSomethingElse() {}
}

您可以按以下方式使用它们:

AClass.DoSomethingElse(); // no object reference required
AClass.DoSomething(); // will give compiler error, since you have no object reference.
var anObject = new AClass();
anObject.DoSomething(); // will work fine.
anObject.DoSomethingElse(); // compile error (thx hvd).

"anObject.DoSomethingElse(); // 也可以正常工作" -- 你确定吗?Mono的编译器会给出一个硬错误“error CS0176:静态成员不能通过实例引用访问,应该使用类型名称进行限定”,我似乎还记得在微软的编译器中也看到过这样的错误。 - user743382
事实上,错误代码CS0176是微软针对该特定错误的代码。 - user743382

1

public static方法不需要对象实例,可以在不创建类的任何实例的情况下使用。

ClassName.MyStaticPublicMethodName()

相比之下,public(非静态)方法需要类的实例,一般来说,公共(非静态)方法可以帮助您处理对象的数据成员(字段)。

要使用非静态公共方法,您需要创建该类的实例。

ClassName obj = new ClassName();
obj.MyPublicMethod();

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接