2010-09-22 23 views
7

Bir sınıfta özel bir üyeniz varsa, sınıf yöntemlerinde ona yalnızca adından söz ederek erişebilirsiniz. this.memberName, sadece memberName çalışır. Bu anahtar kelime üye erişimi bağlamında isteğe bağlı mı?Bu anahtar kelime, C# üyelerine erişirken isteğe bağlı mıdır?

Kapsamı açıklığa kavuşturmak istediğinizde yararlı olduğunu görüyorum - aynı ada sahip 2 değişkeniniz olduğunda. Üyeliklere erişirken kullanmanın başka bir nedeni var mı?

+2

Ben yarısı diğer bir düzine altı olduğunu düşünüyorum: bir uzantısı yöntem çağırdığınızda

Bir yöntemi çağırmak için kullanabilirsiniz gereken tek vaka

olduğunu. – R0MANARMY

+6

Evet, isteğe bağlıdır. Benim düşünceme göre, "bu" nın aşırı kullanımı kodu karıştırıyor. –

+1

[C# Kullanılacak Ne Zaman Kullanılır? Bu "Anahtar Kelime" nin olası kopyası [http://stackoverflow.com/questions/843288/c-when-to-use-this-keyword) –

cevap

12

Evet, isteğe bağlıdır. Kullanmanız gereken tek zaman, bir üye değişkenini gizleyen yerel bir değişkeniniz olduğunda veya bir indexed property (aka indexer) numaralı telefona başvurmak istediğiniz zamanlardır.

+2

Veya bir uzantı yöntemini çağırmak isterseniz. –

+0

Bu doğru, ancak bunu yapmak istediğiniz birçok durum olmayacak. Sınıfa erişiminiz varsa, neden uzantı yöntemlerini tanımlayacaksınız?Düşünebildiğim tek neden, IEnumerable'dan devralınan bir sınıfta ve Enumerable'da tanımlanan uzantı yöntemlerinden birini kullanmak isteyebilirsiniz. –

0

Evet, 'bu' ima edilmiştir. Bazen netlik için yardımcı olabilir. Ayrıca, yöntemleri çağırmak ve mevcut sınıfa başvurmak için de gereklidir. Bir örnek yöntemi çağrıldığında this (bu nesneye atıfta) otomatik olarak görünmez bir parametre olarak geçirilir nedeniyle

+2

Yanılıyorsunuz. "Bu" yazmam gerekmiyor. "bu" sınıfından bir yöntemi çağırmak için. – greenoldman

+1

Arama sınıfının üyelerine (örn. "Geçerli sınıfı referans") başvuran bir yöntemi çağırmak istiyorsanız, demek istedim. Sadece aramak için değil. –

1

İsteğe bağlı olarak, bir örnek yöntemi ya da özelliği gibi bir örneği üyeleri arasından, örneğin elemanı erişim this kullanabilir. x ve y örnek üyeler ise statik yöntem veya özellik içinden this.x veya this.y (hatta basit x ve y) kullanamazsınız gibi

Sen ... örnek üyesine erişmek için statik üyeleri içinden this kullanamaz. Bunun nedeni, statik üye çağrısında this undefined olmasıdır. Statik üye tüm sınıfa aittir ... this'un hangi örneğe başvurduğunu bilmez. Ve bunun nedeni, statik bir yöntem veya özellik çağırdığınızda, aramanın ClassName.MethodName(); biçiminde olması nedeniyle, statik yöntem, this öğesinin hangi nesneye başvurduğunu bilmemesinden kaynaklanır.

this bir uzantısı yönteminin parametre listesindeki ilk modifiye edici olarak (bu kullanılmalıdır) aynı zamanda isteğe bağlı değildir. Aslında this, bir uzatma yöntemi olarak statik bir metodu tanımlar. Şimdi burada this, uzantı yönteminin çalıştığı örnek olarak ilk parametreyi tanımlar.

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

bu doğru, ama jeez kafa karıştırıcı:/ –

+0

Umarım eklenen kod kavramı açıklığa kavuşturacak ve karışıklığı kaldıracaktır. Kod, örnek ve statik üyeler arasında örnek ve statik üyeler arasındaki farkı ve ayrıca "bu" akışını göstermek için özel olarak tasarlanmıştır. – explorer

0

Geçerli sınıfın üyelerini çağırdığınızda "Bu" neredeyse her zaman isteğe bağlıdır. Bununla birlikte, diğer amaçlar için kullanılır, örn. Geçerli sınıf örneğini bir parametre olarak geçirmek veya geçerli örneğe bir özellik, alan veya değişken ayarlamak için. derleyici şikayet etmezse

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

    } 
}