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

时间:2010-08-11 14:19:30

标签: c# this static-members

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

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

13 个答案:

答案 0 :(得分:60)

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

  

The this keyword refers to the current instance of the class. Static member functions do not have a this pointer

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

  

Use the static modifier to declare a static member, which belongs to the type itself rather than to a specific object

这就是为什么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)。您可以在一起使用它们(除了扩展方法等特殊例外情况),从概念上理解thisstatic是什么。