为什么关键字’this’不能用于静态方法?

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

[更新]:实际上,这是我在采访中遇到的一个问题。 我知道’静态’和’这个’的用法,基于你的所有回复,我想我知道为什么两者不能一起使用。 也就是说,静态方法用于更改状态或在类型级别执行某些操作,但是当您需要使用“this”表示您想要更改状态或在实例级别执行某些操作时。 为了区分类型的状态变化和实例的状态变化,c#donot允许在静态方法中使用’this’。 我对吗?

因为this指向类的实例,所以在静态方法中没有实例。

this关键字引用类的当前实例。 静态成员函数没有this指针

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

使用static修饰符声明一个静态成员,该成员属于该类型本身而不是特定对象

这就是为什么没有什么可说的。

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

this指的是类的当前实例,因此只能在实例方法中使用。 静态方法在类级别上起作用,其中没有实例。 因此,没有this

this指的是对象的当前实例。 静态方法是类的一种方法。 它不是一个实例方法,因此在静态方法中使用它是没有意义的。

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

关键字this指的是对象的实例。 在静态上下文中,没有特定的实例可供参考。

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

 MyClass.static_method(); 

与任何对象实例无关(因此您不需要关键字)。

因为static_method()有效,并且不需要其作业的对象实例 。 static_method()不知道你有哪个对象实例 ,但它可以改变所有对象实例的行为:

 MyClass a = new MyClass(); MyClass b = new MyClass(); MyClass.static_method("PRINTER"); a.display(); //print something b.display(); //print something MyClass.static_method("MONITOR"); a.display(); //display something on monitor b.display(); //display something on monitor 

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

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

‘this’指的是一个类的实例。 静态初始化没有实例化,因此静态方法不能引用未创建的“实例”。

简短的答案是:这是指静态范围中不存在的类的实例。

但是,在进一步研究任何面向对象的编程语言之前,请寻找一本好书/类并尝试理解基本的面向对象概念。

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

 MyStaticClass.foo(); 

简单地说

 foo(); 

将调用MyStaticClass类中的foo()方法,假设您从MyStaticClass中调用foo()

编辑 – 记住静态类和非静态类之间区别的最简单方法是考虑像java中的Math类。 你可以调用Math.abs(x); 获取x的绝对值,并且实例化Math对象实际上没有意义,这就是Math是静态类的原因。

另一个更字面意思的问题是:

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

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

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

 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的方法。 该语法用于在C#中定义扩展方法 。 自2007年发布的C#3.0( 维基百科 )以来,此function一直可用

在正常使用中, this指的是实例, static表示没有实例(因此没有this )。 事实上,你不能一起使用它们(除了像扩展方法这样的特殊例外),从概念上理解thisstatic是自然而然的。