在Java和/或C#中使用“this”有什么用?

时间:2013-12-04 20:25:01

标签: c# java

假设我有一个简单的示例控制台程序,如下所示。我的问题是关于this。仅仅使用this是否可以使用输入变量名来分配给实例变量?我想知道this的用法除了在这个程序的上下文中使用了什么之外?

public class SimpleClass {

    int numberOfStudents;

    public SimpleClass(){
        numberOfStudents = 0;
    }

    public void setStudent(int numberOfStudents){
        this.numberOfStudents = numberOfStudents;
    }

    public void printStudents(){
        System.out.println(numberOfStudents);
    }

    public static void main(String[] args) {

        SimpleClass newRandom = new SimpleClass();
        newRandom.setStudent(5);
        newRandom.printStudents();

    }
}

以前,当我需要为与输入值具有相似性的实例变量名称分配值时,我必须使用我的命名方案(或缺少)来创造。例如,setStudent()方法如下所示:

public void setStudent(int numberOfStudentsI){
    numberOfStudents = numberOfStudentsI;
}

从上面的例子来看,似乎使用this取代必须这样做。这是它的用途,还是我错过了什么?

6 个答案:

答案 0 :(得分:2)

事情与你现在如何看待它们完全相反:this是Java / C#中一个如此重要且经常使用的项目,它有许多特殊的语法规则,允许它们在哪里假设。这些规则导致您实际上很少看到this写出来。

但是,除了您的示例之外,还有许多其他无法避免显式this的情况(Java):

  • 引用内部类的封闭实例;
  • 显式参数化对泛型方法的调用;
  • this作为参数传递给其他方法;
  • 从方法返回this(使用 Builder 模式定期发生);
  • this分配给变量;

......等等。

答案 1 :(得分:1)

如果您想要引用对象本身,也会使用

this

someMethod(this);

除了这种语法之外别无选择(双关语)。

它也用于调用共同构造函数和C#扩展方法。

答案 2 :(得分:1)

'this'只是指对象本身。

当编译器查找'numberOfStudents'的值时,它会匹配具有此名称的'nearest'变量。在这种情况下函数的参数。 但是如果你想将它分配给类变量,你需要使用'this。' - 表示法!

方法

public void setStudent(int numberOfStudents){
    this.numberOfStudents = numberOfStudents;
}

例如。

'this.numberOfStudents'引用名为'numberOfStudents'的类变量 'numberOfStudents'引用方法的参数

因此,这个方法简单地将参数的值赋给类变量(具有相同的名称)。

答案 3 :(得分:0)

在c#中你使用它来引用类对象的当前实例immagine你有这样的类来自msdn

    class Employee
    {
        private string name;
        private string alias;
        private decimal salary = 3000.00m;

        // Constructor: 
        public Employee(string name, string alias)
        {
            // Use this to qualify the fields, name and alias: 
            this.name = name;
            this.alias = alias;
        }
        // Printing method: 
        public void printEmployee()
        {
            Console.WriteLine("Name: {0}\nAlias: {1}", name, alias);
            // Passing the object to the CalcTax method by using this:
            Console.WriteLine("Taxes: {0:C}", Tax.CalcTax(this));
        }

        public decimal Salary
        {
            get { return salary; }
        }
    }

    class Tax
    {
        public static decimal CalcTax(Employee E)
        {
            return 0.08m * E.Salary;
        }
    }

    class MainClass
    {
        static void Main()
        {
            // Create objects:
            Employee E1 = new Employee("Mingda Pan", "mpan");

            // Display results:
            E1.printEmployee();
        }
    }
    /*
    Output:
        Name: Mingda Pan
        Alias: mpan
        Taxes: $240.00
     */

答案 4 :(得分:0)

Java / C#中有不同的变量范围。以下面的例子为例。虽然this.numberOfStudentsnumberOfStudents具有相同的名称,但它们并不完全相同。

public void setStudent(int numberOfStudents){
    this.numberOfStudents = numberOfStudents;
}

this.numberOfStudents是一个名为numberOfStudents的变量,它位于此类的实例中。 this始终指向当前实例。

public void setStudent(int numberOfStudents) numberOfStudents是此方法中可用的新变量。

答案 5 :(得分:0)

关键字“this”指的是当前类的对象(SimpleClass)。

public class SimpleClass(){

    private int a;
    private int b;
    private int c;

    public SimpleClass(int a, int b){
       this.a = a;
       this.b = b;
    }

    public SimpleClass(int a, int b, int c){
       // this constrcutor
       this(a,b);
       this.c = c;
    }
}