为什么静态方法只允许调用静态方法而不允许调用非静态方法
本文关键字:静态方法 调用 不允许 许调用 为什么 | 更新日期: 2023-09-27 18:11:44
可能重复:
为什么我只能从静态函数访问静态成员?
当我试图从静态方法内部调用一个普通方法时,我得到了错误:
非静态字段、方法或属性需要对象引用
因此,这意味着我需要创建Class的对象,然后调用非静态方法。如果我想直接调用该方法,那么我必须将该方法声明为Static。
但是,在这种情况下,调用方法和被调用方法属于同一类。那么,为什么我需要在从静态方法调用时创建一个对象,而我可以从非静态方法调用非静态方法。
例如:
class Program
{
//public void outTestMethod(int x,out int y)
//{
// y = x;
//}
static void Main(string[] args)
{
int a = 10;
int b = 100;
outTestMethod(a,out b);
}
private void outTestMethod(int x, out int y)
{
y = x;
}
}
Error:An object reference is required for the non-static field, method, or property
静态方法可以调用实例方法,但您需要有一个实例来调用它们。这个实例具体来自哪里并不重要,例如:
int a = 10;
int b = 100;
Program program = new Program();
program.outTestMethod(a,out b);
实例方法与类型的特定实例相关联,而静态方法则与整个类型相关联,其他类型的成员也是如此。因此,要调用实例方法,你需要知道你感兴趣的实例。例如,拥有是没有意义的
string name = Person.Name;
因为你需要知道你说的是哪个人:
Person person = FetchPersonFromSomewhere();
string name = person.Name;
这更有道理。
通常,实例方法使用或修改实例的状态。
这样想吧。
静态方法是在一排电梯外按下按钮。任何人都可以看到它并推动它,然后做出一些事情(即其中一部电梯将到达该楼层(。
非静态方法是特定电梯内的按钮。他们操纵那部电梯(其他人都没有(。
非静态方法也称为实例方法。这意味着(通常(有一块数据,特定于该方法操作的实例(对象(
您不能从静态方法调用非静态或实例方法,因为它不知道要对哪个实例或对象进行操作。
因为没有实例可以从中调用方法。你应该创建另一个类并测试它:
class Program
{
static void Main(string[] args)
{
int a = 10;
int b = 100;
Test testclass = new Test();
testclass.outTestMethod(a,out b);
}
}
class Test
{
public void outTestMethod(int x, out int y)
{
y = x;
}
}
您了解实例方法和静态方法之间的区别吗?
实例方法可以访问this
对象,即使它不是作为参数传入的,事实上,它就像是框架为您传递的同一类的不可见参数。
静态方法没有那个this
对象,并且不能调用实例方法,因为它没有任何东西可以以不可见的方式传递给那个this
。。。
听起来像个笑话,但我是这样看的:(