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