2010-09-22 26 views
7

Tôi nhận thấy rằng nếu bạn có một thành viên riêng trong một lớp, bạn có thể truy cập nó trong các phương thức lớp bằng cách chỉ đề cập đến tên của nó. Bạn không cần phải nói this.memberName, chỉ cần memberName hoạt động. Vì vậy, là từ khóa này tùy chọn trong bối cảnh truy cập thành viên?Từ khóa `này` có tùy chọn khi truy cập các thành viên trong C# không?

Tôi thấy nó hữu ích khi bạn muốn làm rõ phạm vi - khi bạn có 2 biến có cùng tên. Có lý do nào khác để sử dụng nó khi truy cập thành viên không?

+2

Nếu trình biên dịch không phàn nàn Tôi nghĩ đó là sáu người một nửa tá của người kia. – R0MANARMY

+6

Có, tùy chọn. Theo ý kiến ​​của tôi, việc sử dụng quá mức "điều này" làm lộn xộn mã. –

+1

bản sao có thể có của [C# Khi sử dụng "Từ khóa" này "(http://stackoverflow.com/questions/843288/c-when-to-use-this-keyword) –

Trả lời

12

Có, tùy chọn. Lần duy nhất bạn phải sử dụng nó là khi bạn có biến cục bộ ẩn biến thành viên hoặc bạn muốn tham chiếu đến một số indexed property (aka indexer).

+2

Hoặc nếu bạn muốn gọi một phương thức mở rộng. –

+0

Điều đó đúng, nhưng sẽ không có nhiều tình huống mà bạn muốn làm điều đó. Nếu bạn có quyền truy cập vào lớp, tại sao bạn sẽ định nghĩa các phương thức mở rộng trên nó?Lý do duy nhất tôi có thể nghĩ là có thể trong một lớp kế thừa từ IEnumerable và bạn muốn sử dụng một trong các phương thức mở rộng được định nghĩa trong Enumerable. –

0

Có, 'điều này' được ngụ ý. Đôi khi nó có thể giúp cho sự rõ ràng. Và nó cũng cần thiết cho các phương thức gọi và cần tham khảo lớp hiện tại.

+2

Bạn đã sai. Tôi không phải gõ "cái này". để gọi một phương thức từ lớp "này". – greenoldman

+1

Ý tôi là, nếu bạn muốn gọi phương thức tham chiếu lại thành viên của lớp gọi điện (nghĩa là "tham chiếu lớp hiện tại"). Không chỉ gọi nó. –

1

Bạn có thể tùy chọn sử dụng this trong việc tiếp cận thành viên dụ từ bên trong một thành viên dụ như một phương pháp dụ hoặc tài sản vì bất cứ khi nào một phương pháp dụ được gọi là this (đề cập đến đối tượng hiện hành) được tự động thông qua tại như một tham số vô hình.

Bạn không thể sử dụng this từ bên trong các thành viên tĩnh để truy cập thành viên dụ ... như bạn không thể sử dụng this.x hoặc this.y (hoặc thậm chí x đơn giản và y) từ bên trong một phương pháp tĩnh hoặc tài sản nếu x và y là các thành viên dụ. Điều này là do this không được xác định trong cuộc gọi thành viên tĩnh. Các thành viên tĩnh thuộc về cả lớp ... nó không có ý tưởng mà dụ this là đề cập đến. Và đó là do thực tế là khi bạn gọi một phương pháp tĩnh hoặc tài sản, cuộc gọi có định dạng ClassName.MethodName(); Vì vậy, phương pháp tĩnh không biết đối tượng this sẽ tham chiếu.

this cũng không phải là tùy chọn (nó phải được sử dụng) làm công cụ sửa đổi đầu tiên trong danh sách tham số của một phương pháp mở rộng. Trong thực tế, this là những gì xác định một phương thức tĩnh như là một phương thức mở rộng. Tại đây, this xác định tham số đầu tiên là trường hợp mà phương thức mở rộng đang hoạt động.

using System; 



    class Class_name 
    { 


     static string static_variable="static"; 

     string instance_variable="instance"; 


     static void Main() 
     { 

      Class_name object_name = new Class_name(); 

      Console.WriteLine("Printing out instance and static variables from within Main() body :"); 

      Console.WriteLine(object_name.instance_variable); 
      Console.WriteLine(Class_name.static_variable); 

      /* Note that we cannot say either of the following : 

        object_name.static_variable 
        Class_name.instance_variable 


      */ 

      Console.WriteLine(); 




      // now lets call the static and instance methods 

      object_name.Instance_method(); // Now this is the key call which 
      // passes "this" as an invisible parameter 
      // to the Instance_method. "this" refers to 
      // object_name 


      Class_name.Static_method();// "this" is NOT passed to Static_method() because now 
      // the call is made on Class_name ... so there is nothing 
      // to be represented by "this" 


      Console.ReadLine(); 

     } 



     void Instance_method() 
     { 

      // here we receive "this" as an invisible parameter referring 
      // to the object on which Instance_method is called (i.e. object_name)... 
      // ... see the Main() method for comments at the call site. 


      Console.Write("Instace method called ... " + 
          "prints out instance variable twice, with and without 'this': "); 

      // the following two calls mean exactly the same. 

      Console.Write(this.instance_variable); 
      Console.WriteLine (instance_variable); 



      // one little additional point is that static members are 
      // accessible from within instance members 


      Console.WriteLine(); 

      Console.Write("static variables can also be accessed from within Instance_method: "); 
      Console.WriteLine(static_variable); 

      Console.WriteLine(); 
      Console.WriteLine(); 




     } 


     static void Static_method() 
     { 

      // See the Main() method body for the call Class_name.Static_method() 
      // Notice that this method is called on Class_name and not object_name 
      // which means that there is no invisibly passed-in "this" parameter available 
      // in this method. 

      // we can also not access the instance_variable in this method 
      // as instance variables are always part of some object. This method 
      // is not called on any object, its called on Class_name. 

      // Console.WriteLine(instance_variable); // Compiler error 

      Console.WriteLine("Static method called ... prints out static variable: "); 
      Console.WriteLine(static_variable); 




     } 






    } 
+0

thats chính xác, nhưng jeez nó gây nhầm lẫn:/ –

+0

Tôi hy vọng mã bổ sung sẽ làm rõ khái niệm và loại bỏ sự nhầm lẫn. Mã này được thiết kế đặc biệt để minh họa sự khác biệt giữa việc truy cập cá thể và các thành viên tĩnh từ bên trong các cá thể và các thành viên tĩnh và cũng là luồng của "điều này". – explorer

0

"Điều này" hầu như luôn là tùy chọn khi bạn gọi cho các thành viên của lớp hiện tại.

Tuy nhiên, nó được sử dụng cho các mục đích khác, ví dụ: để vượt qua cá thể lớp hiện tại làm tham số hoặc để đặt thuộc tính, trường hoặc biến cho cá thể hiện tại.

Trường hợp duy nhất mà bạn phải sử dụng nó để gọi một phương thức là khi bạn gọi một phương pháp mở rộng:

class AClass { 
    void CallIt() { 
     Test();      //not valid 
     this.Test();    //valid 
    } 
} 
static class AnExtension { 
    public static void Test(this AClass source) { 

    } 
} 
Các vấn đề liên quan