Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/svg/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 为什么使用关键字';这';不能在静态方法中使用?_C#_This_Static Members - Fatal编程技术网

C# 为什么使用关键字';这';不能在静态方法中使用?

C# 为什么使用关键字';这';不能在静态方法中使用?,c#,this,static-members,C#,This,Static Members,为什么不能在静态方法中使用关键字this?我想知道为什么C#定义了这个约束。这种限制可以带来什么好处 [更新]: 事实上,这是我在采访中得到的一个问题。 我确实知道“static”和“this”的用法,根据你的回答,我想我知道一点为什么这两个词不能一起使用。也就是说,对于静态方法,它用于更改状态或在类型级别执行某些操作,但当您需要使用“this”时,它意味着您希望更改状态或在实例级别执行某些操作。为了区分类型的状态更改和实例的状态更改,c#不允许在静态方法中使用“this”。我说得对吗?因为这个

为什么不能在静态方法中使用关键字
this
?我想知道为什么C#定义了这个约束。这种限制可以带来什么好处

[更新]: 事实上,这是我在采访中得到的一个问题。
我确实知道“static”和“this”的用法,根据你的回答,我想我知道一点为什么这两个词不能一起使用。也就是说,对于静态方法,它用于更改状态或在类型级别执行某些操作,但当您需要使用“this”时,它意味着您希望更改状态或在实例级别执行某些操作。为了区分类型的状态更改和实例的状态更改,c#不允许在静态方法中使用“this”。我说得对吗?

因为
这个
指向类的一个实例,在静态方法中没有实例

您会注意到静态成员的定义是


这就是为什么
this
没有任何指向。

关键字
this
指的是对象的实例。在静态上下文中,没有要引用的特定实例。

是当前对象的实例。使用静态方法时,没有当前对象,因此,
不存在。它实际上不是一个约束,而是一个方法的整个点是静态的。

指的是类的当前实例,因此只能在实例方法中使用。静态方法作用于类级别,其中没有实例。因此,没有
引用对象的当前实例。静态方法是类上的方法。它不是实例方法,因此在静态方法中使用它是没有意义的。

用于引用变量或方法的父对象。在方法上声明
static
时,可以调用该方法,而无需实例化类的对象。因此,不允许使用
this
关键字,因为您的静态方法与任何对象都没有关联。

我很确定这并不局限于C#,它不是一个约束,而是一种逻辑情况。正如@Yuriy正确指出的那样,这指的是一个类的当前实例,即您已经使用new(或DI)来实例化该类(创建了一个实例),并且您需要某种方式在内部引用该实例,即该对象。调用静态方法时不实例化类,实际上没有创建对象,因此您无法访问其中的属性。

“this”指的是类的实例。静态是在没有实例化的情况下初始化的,因此静态方法不能引用未创建的“实例”。

通过静态方法,您可以编写:

MyClass.static_method();
这与任何对象实例无关(因此您不需要此关键字)

因为static_method()可以工作,并且其工作不需要对象实例。static_method()不知道您有哪个对象实例,但它可以更改行为 在所有对象实例中:


在这种情况下,static_method()会更改MyClass的所有对象实例中display()方法的行为。

简单的回答是:这是指静态范围中不存在的类的实例


但是,在继续学习任何面向对象编程语言之前,请先找一本好书/一节课,并尝试理解基本的面向对象概念。

我不确定这是否有助于解决您的问题,但我相信这两个代码片段是等效的:

MyStaticClass.foo();
而且很简单

foo();
假设您从MyStaticClass内部调用foo(),则两者都将调用MyStaticClass类中的foo()方法


编辑—记住静态类和非静态类之间区别的最简单方法是考虑java中的Math类。你可以调用Math.abs(x);要获得x的绝对值,实例化一个数学对象是没有意义的,这就是为什么数学是一个静态类。

另一个更具体的问题是:

“this”关键字不能在静态方法中使用,以避免与它在实例方法中的用法混淆,在实例方法中,它是访问作为隐藏参数自动传递给该方法的实例的指针(引用)的符号

如果不是这样,您可能会在静态方法中定义一个名为“this”的局部变量,但这与实例方法中引用的“this”关键字实例无关

下面是一个具有两个等效方法的示例,一个是静态方法,另一个是实例方法。 两个方法调用都将向执行相同操作(在控制台上打印对象的字符串表示)并返回的代码的方法传递一个参数

public class Someclass {

  void SomeInstanceMethod() 
    { System.Console.WriteLine(this.ToString()); }

  void static SomeStaticMethod(Someclass _this) 
    { System.Console.WriteLine(_this.ToString()); }

  public void static Main()
    {
       Someclass instance = new Someclass();
       instance.SomeInstanceMethod();
       SomeStaticMethod(instance);
    }
}

this
关键字可用于标记为
static
的方法中。语法用于定义。此功能自2007年发布的C#3.0()


在正常使用中,
this
指的是实例,
static
表示没有实例(因此没有
this
)。您不能同时使用它们(除了扩展方法等特殊例外)这一事实是从概念上理解
this
static
是什么自然产生的。

请解释为什么静态方法中没有实例:)想想如何调用静态方法。与Animal.Eat()类似,调用静态方法不需要实例(new Animal())。这就是为什么没有。我无法想象静态动物,更不用说吃东西的动物了。静态类和静态类成员(C#编程指南):你能告诉我们你想做什么,以及为什么你认为它会涉及到
静态
这个
的组合吗?通常,如果需要混合使用这两种方法,可以从非静态me调用静态方法
public class Someclass {

  void SomeInstanceMethod() 
    { System.Console.WriteLine(this.ToString()); }

  void static SomeStaticMethod(Someclass _this) 
    { System.Console.WriteLine(_this.ToString()); }

  public void static Main()
    {
       Someclass instance = new Someclass();
       instance.SomeInstanceMethod();
       SomeStaticMethod(instance);
    }
}