为什么关键字’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
)。 事实上,你不能一起使用它们(除了像扩展方法这样的特殊例外),从概念上理解this
和static
是自然而然的。