为什么不能在静态方法中使用关键字this
?我想知道为什么C#定义了这个约束。这种约束可以带来什么好处?
[更新]: 实际上,这是我在采访中遇到的一个问题。 我知道'静态'和'这个'的用法,基于你的所有回复,我想我知道为什么这两个不能一起使用。也就是说,静态方法用于更改状态或在类型级别执行某些操作,但是当您需要使用“this”表示您想要更改状态或在实例级别执行某些操作时。为了区分类型的状态变化和实例的状态变化,c#donot允许在静态方法中使用'this'。我是对的吗?
答案 0 :(得分:60)
因为this
指向类的实例,所以在静态方法中没有实例。
您会注意到静态成员的定义是
这就是为什么this
无需指出的原因。
答案 1 :(得分:13)
this
是当前对象的一个实例。使用静态方法,没有当前对象,因此this
不存在。这不是一个约束,但方法的整个要点是 static 。
答案 2 :(得分:2)
this
是指类的当前实例,因此只能在实例方法中使用。静态方法在类级别上起作用,其中没有实例。因此,没有this
。
答案 3 :(得分:2)
this
指的是对象的当前实例。静态方法是类的一种方法。它不是一个实例方法,因此在静态方法中使用它是没有意义的。
答案 4 :(得分:2)
我很确定这不仅限于C#而且它不是一个约束,这是一个合乎逻辑的情况。正如@Yuriy正确指出的那样,这是指一个类的当前实例,即你已经使用new(或DI)来实例化该类(创建了一个实例),你需要在内部引用该实例,即宾语。在没有实例化类的情况下调用静态方法,实际上没有创建对象,因此您无法访问属于它的属性。
答案 5 :(得分:1)
关键字this
是指对象的实例。在静态上下文中没有要引用的特定实例。
答案 6 :(得分:1)
通过静态方法,您可以写:
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()方法的行为。
答案 7 :(得分:0)
this
用于引用变量或方法的父对象。在方法上声明static
时,可以调用该方法,而无需实例化该类的对象。因此,不允许this
关键字,因为您的静态方法与任何对象都没有关联。
答案 8 :(得分:0)
'this'指的是一个类的实例。静态初始化没有实例化,因此静态方法不能引用未创建的“实例”。
答案 9 :(得分:0)
您的简短回答是:这是指静态范围内不存在的类的实例。
但请在寻找一本好的书/类之前尝试理解基本的面向对象概念,然后再继续学习任何面向对象的编程语言。
答案 10 :(得分:0)
我不确定这是否有助于解决您的问题,但我相信这两个代码段是等效的:
MyStaticClass.foo();
简单地
foo();
将调用MyStaticClass类中的foo()方法,假设您从MyStaticClass中调用foo()
编辑 - 记住静态类和非静态类之间区别的最简单方法是考虑像java中的Math类。你可以调用Math.abs(x);获取x的绝对值,并且实例化Math对象没有意义,这就是Math是静态类的原因。
答案 11 :(得分:0)
另一个更直接的问题是:
'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);
}
}
答案 12 :(得分:0)
可以在标记为this
的方法中使用static
关键字 。语法用于定义extension methods in C#。自2007年发布的C#3.0(Wikipedia)
在正常使用中,this
表示实例,static
表示没有实例(因此没有this
)。您可以在一起使用它们(除了扩展方法等特殊例外情况),从概念上理解this
和static
是什么。