c# - 为什么静态方法只允许调用静态方法而不是非静态方法

标签 c# .net oop static-methods

<分区>

Possible Duplicate:
Why can I only access static members from a static function?

当我尝试从静态方法内部调用普通方法时出现错误:

An object reference is required for the non-static field, method, or property

所以这意味着我需要创建类的对象,然后调用非静态方法。如果我想直接调用该方法,则必须将该方法声明为 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;
        }
    }

错误:非静态字段、方法或属性需要对象引用

最佳答案

静态方法可以调用实例方法——但您需要有一个实例来调用它们。该实例具体来自何处并不重要,例如:

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;

...这更有意义。

通常实例方法使用或修改实例的状态

关于c# - 为什么静态方法只允许调用静态方法而不是非静态方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7837250/

相关文章:

java - 让通用 AsyncTask 处理任何异常

c# - 来自 C# 代码隐藏的动态 Plotly 图

c# - NullReferenceException 与 ArgumentNullException

.net - .NET HTML白名单(反xss/跨站点脚本)

c# - 通过父类中的函数访问子类属性

java - 如果代码被编译,一个带有构造函数的类是否会单独创建该类?

javascript - JSNlog 异常格式问题

c# - 如何找出局部变量声明使用了什么关键字?

mysql - 客户端的 WAMP MYSQL 或 MYSQL 服务?

c++ - 如何在 C++ 的 OOP 中使用 >> 运算符