“This” anahtar kelimesini ne zaman kullanıyorsunuz? [kapalı]


249

Başkalarının bu anahtar kelimeyi nasıl kullandığını merak ediyordum . Bunu yapıcılarda kullanma eğilimindeyim ama sınıf boyunca diğer yöntemlerde de kullanabilirim. Bazı örnekler:

Bir kurucuda:

public Light(Vector v)
{
    this.dir = new Vector(v);
}

başka yerde

public void SomeMethod()
{
    Vector vec = new Vector();
    double d = (vec * vec) - (this.radius * this.radius);
}

2
MSDN'de gerçekten ihtiyacınız olduğunda iyi örnekler buldum this. Lütfen bu bağlantıyı takip edin ... ;-)
Matt

12
Başkasını anlamak ve optimize etmek ya da yeniden yazmak zorundaysanız, çoğunlukla kötü yazılmış bir kod thisveya başka bir niteleyici olmaktan mutluluk duyarsınız, böylece basit bir bakış açısından değişkenin kapsamını bilirsiniz (Özellikle sabitler için atlanmış sınıf niteleyicileri (aynı paket veya hiyerarşi) veya super/ baseniteleyiciler). Ve yaygın olarak kullanılan sözdizimini kullanmak _foobenim için zarif görünmüyor. Zekâ _için baskı yapmak, girmekten daha fazla zaman alır this. Ve neden hiç rahatsız etmiyorsun! Tutulma otomatik kaydetme biçimlendirme işlevleri _ile niteleyiciyi unutmanız gerekmez .
djmj

Aşağıdaki yanıtları ve yorumları okuduktan ve MSDN belgelerini okuduktan sonra: 6 yıl içinde güncellenmemiş olan bu anahtar kelime üzerinde docs.microsoft.com/en-us/previous-versions/visualstudio/… , bu anahtar kelimeyi hiç kullanmamak için . Bu anlamsız. Parametreleri aynı isimde yapma, bu kafa karıştırıcı ve aptalca. Neden bunu yapasın ki? Ayrıca kullanarak örneğini geçemiyor bu , aynı zamanda kafa karıştırıcı ve aptal oluyor.
Yusha

Yanıtlar:


218

Bu anahtar kelimenin C # içinde birkaç kullanımı vardır .

  1. Benzer adla gizlenmiş üyelere hak kazanmak için
  2. Bir nesnenin kendisini diğer yöntemlere parametre olarak geçirmesini sağlamak
  3. Bir nesnenin kendisini bir yöntemden döndürmesi için
  4. Dizin oluşturucuları bildirmek için
  5. Uzatma yöntemlerini beyan etmek
  6. Parametreleri yapıcılar arasında geçirmek
  7. Değer türü (yapı) değerini dahili olarak yeniden atamak için .
  8. Geçerli örnekte bir uzantı yöntemini çağırmak için
  9. Kendini başka bir türe atmak için
  10. Aynı sınıfta tanımlanan kurucuları zincirlemek

Kapsamlı olarak aynı ada sahip üye ve yerel değişkenlere sahip olmayan ilk kullanımdan kaçınabilirsiniz, örneğin, yerel değişkenlerle (deve de) çarpışmayı önlemek için ortak adlandırma kurallarını izleyerek ve alanlar (deve örneği) yerine özellikler (Pascal örneği) kullanarak durum). C # 3.0 alanları otomatik olarak uygulanan özellikleri kullanarak kolayca özelliklere dönüştürülebilir .


49
8. Mevcut örnekte bir uzatma yöntemini çağırmak ( this.Foo();çalışacak, ancak çalışmayacak Foo())
Marc Gravell

4
Ayrıca kendini başka bir türe atmak için, örneğin açıkça uygulanan bir yöntem gibi adlandırılacaktır ((ICollection<T>)this).Add(bla).
nawfal

4
İnşaatı aynı tipte tanımlanan başka bir kurucuya zincirlemek. public ClassName(...) : this(...).
Lasse V. Karlsen

1
@Ayrıca çalışma zamanında performansı etkilemez. Belirsizlik yoktur varsayarsak, derleyici'nın çıkışı olursa olsun örneğin, yazma bakılmaksızın aynı şekilde this.someField = someValueya someField = someValue. Derleyicinin performansı etkileyebilir, çünkü derleyici kaynak kodunu farklı şekilde ayrıştırır, ancak herhangi bir fark kesinlikle ihmal edilebilir.
phoog

7
İlk sorundan , özelliklerin parametrelerle aynı adlara sahip olamayacağı bir stil kuralına bağlı kalırsanız , özellikler yoluyla alanlara erişerek önleyebilirsiniz . Sadece yaygın C # tarzı kural bu gereksinimi karşılar. Bununla birlikte, tüm C # kuralları bu sözleşmeye göre yazılmamıştır. thisAnahtar kelimeyi gereksiz kılacak özellikler hakkında doğal bir şey yoktur ; adlı bir yapıcı parametresi , üyenin bir alan, özellik veya olay olup olmadığı xadlı bir üyeyi gizler x.
phoog

246

Bunu kulağa iğrenç geliyor demek istemiyorum, ama önemli değil.

Ciddi anlamda.

Önemli olan şeylere bakın: projeniz, kodunuz, işiniz, kişisel yaşamınız. Hiçbiri, alanlara erişimi nitelemek için "bu" anahtar kelimeyi kullanıp kullanmadığınız konusunda başarılı olamayacak. Bu anahtar kelime zamanında gönderiminize yardımcı olmaz. Hataları azaltmayacak, kod kalitesi veya sürdürülebilirliği üzerinde kayda değer bir etkisi olmayacaktır. Sana zam vermeyecek ya da ofiste daha az zaman geçirmene izin vermeyecek.

Gerçekten sadece bir stil sorunu. Eğer "bu" isterseniz, o zaman kullanın. Eğer yapmazsan, yapma. Doğru semantiği elde etmek için ihtiyacınız varsa kullanın. Gerçek şu ki, her programcının kendine özgü bir programlama tarzı vardır. Bu tarz, belirli bir programcının "estetik açıdan en hoş kodun" neye benzemesi gerektiği fikrini yansıtır. Tanım olarak, kodunuzu okuyan diğer tüm programcılar farklı bir programlama stiline sahip olacaktır. Bu, her zaman yaptığınız, diğer adamın beğenmediği veya farklı yapacağı bir şey olacağı anlamına gelir. Bir noktada bazı adam kodunuzu okuyacak ve bir şey hakkında homurdanacak.

Üzülmem. Ben sadece kendi zevkinize göre mümkün olduğunca estetik olarak kod emin olun. 10 programcıya kodu nasıl biçimlendireceğinizi sorarsanız, yaklaşık 15 farklı görüş alırsınız. Odaklanmak için daha iyi bir şey, kodun nasıl faktörlü olduğu. İşler soyutlanmış mı? Şeyler için anlamlı isimler seçtim mi? Çok fazla kod çoğaltma var mı? İşleri basitleştirmenin yolları var mı? Bunları doğru yapmak, bence, projeniz, kodunuz, işiniz ve yaşamınız üzerinde en büyük olumlu etkiye sahip olacak. Tesadüfen, muhtemelen diğer adamın en az homurdanmasına neden olur. Kodunuz çalışırsa, okunması kolay ve iyi faktörlü ise, diğer kişi alanları nasıl başlattığınızı incelemeyecektir. O sadece kodunu kullanacak, onun büyüklüğüne hayret edecek,


35
thisAnahtar kelime semantik olarak anlamlıdır. Aşağıdaki @ JasonBunting'in yorumuna bakın. Stilistik aşırı kullanımı thisgerçek amacı ile karıştırıyorsunuz . Sözün sadece küstah değil, yanlış!
Dan Barowy

12
Eğer bir şansınız varsa, cevabımı tekrar okumak isteyebilirsiniz. Doğru anlambilimin gerekli olduğu durumlarda kullanmaktan bahsediyorum. Ayrıca başlangıç ​​sorusuna da bakmak isteyebilirsiniz. Anlamsal olarak gerekli olmayan örneklerde kullanımı göstermektedir. Yani, bunun yanlış olduğunu söylediğimden tam olarak emin değilim. Cevabım kesinlikle saygısız değil.
Scott Wisniewski

9
Cevabının bana nasıl geldiğini biliyor musun? Satırların arasında "Böyle bir soru sormaya nasıl cüret edersin?" - Bence bu yapıcı değil. Kimse her şeyi bilmiyor - bu yüzden Stackoverflow'a sahibiz: Başkalarına yardım etmek ve yardım almak. Bildiğiniz bazı konular, bazıları ise diğerlerini tanıyor. Birbirinize yardım edin, birbirinizle kavga etmeyin. Lütfen düşünün.
Matt

9
Sinsi görünmek istemiyorum, ama bu şimdiye kadarki en kötü cevaplardan biri. Bunu işinizle veya kişisel yaşamınızla karşılaştırmanın ne kadar yararlı olduğunu görmüyorum. Bazı şeylerin diğerlerinden daha az önemli olması, önemsiz oldukları anlamına gelmez . Tutarlı bir programlama stiline sahip olmak önemsiz değildir (seçtiğiniz kod okunabilirliği / bakımı ile ilgili bir kitap okuyun).
aioobe

4
Benim fikrimi yanlış anlamış olabilirsiniz. "Tutarlı bir tarza sahip olmak" kötü değildi. Bu konuda hiçbir şey söylemiyorum. "Stil rehberim" bunu zorunlu kılmalı mı? "Op sorusu. tüm alan erişimleri için önek olarak? " keyfi ve kaprislidir.
Scott Wisniewski

96

Sadece kesinlikle gerekli olduğunda, yani başka bir değişken diğerini gölgelediğinde kullanıyorum. Burada olduğu gibi:

class Vector3
{
    float x;
    float y;
    float z;

    public Vector3(float x, float y, float z)
    {
        this.x = x;
        this.y = y;
        this.z = z;
    }

}

Veya Ryan Fox'un işaret ettiği gibi, bunu bir parametre olarak geçirmeniz gerektiğinde. (Yerel değişkenlerin üye değişkenlere göre önceliği vardır)


6
Bu durumda neden yalnızca yapıcı giriş değişkenlerine farklı adlar vermiyorsunuz?
wz366

54

Şahsen ben her zaman kullanmayı deneyin bu üye değişkenlere bahsederken. Kodu netleştirmeye ve daha okunabilir hale getirmeye yardımcı olur. Belirsizlik olmasa bile, kodumu ilk kez okuyan biri bunu bilmiyor, ancak bunun sürekli olarak kullanıldığını görürlerse, bir üye değişkenine bakıp bakmadıklarını bilecekler.


9
ancak bir süre kullanmayı unutursanız, karışırlar
surfen

2
Ek stil kontrolleri ile önlenebilecek bir sörfçü, örneğin Java'da Checkstyle'i kullanabilir ve tam bir derlemeden sonra çalıştırabilirsiniz (ve herhangi bir popüler yinelemeli / OO dilinde benzer araçlar olacaktır)
Maarten Bodewes

5
Belirsiz durumlarda unutuyormuşsunuz gibi. "Ama unutursan ..." diyerek her türlü argümanı kırabilirim.
Askolein

6
Çoğu insan asla başkasının kodunu okumaz, optimize etmez veya yeniden yazmaz gibi görünüyor! Elemeler zaman ve motivasyon tasarrufu sağlar! Herhangi bir keyfi kod satırı görürseniz niteleyici olmadan sihir gibi. Böylece bu değişkenlerin nereden geldiğini kontrol ederek tüm zamanınızı boşa harcıyorsunuz.
djmj

3
Bu çok eski bir yazı olduğunu biliyorum, ama sadece yardım edemem ama bu cevabın ironisi hakkında yorum (ki ben katılıyorum). Kötü Macar Gösterimine karşı Cihad'da, üye değişkenlerini "m_" ile önek olarak cesaretlendiren herkes, üye değişkenleri ayırt etmek yararlı ya da ihtiyaç duyulmadığı için hızlı bir şekilde düzeltildi.
Michael

38

İhtiyacım olmasa bile bir örnek değişkenine her başvurduğumda kullanıyorum. Bence kodu daha açık hale getiriyor.


Sınıf değişkenlerini olabildiğince ayırt etmek istiyorum, bu yüzden kod daha açık. M_ (üye değişken) önekini kullanıyordum, örneğin özel dizge m_adı Şimdi sadece bu örneğin sınıf Test {private string a; public someMethod () {this.a = "foo"; }}
geniş bant

36

Bunu her zaman kullanmanın "en iyi uygulama" olduğunu söyleyen insanların hepsine inanamıyorum.

Corey örneğinde olduğu gibi belirsizlik olduğunda veya nesneyi Ryan örneğinde olduğu gibi parametre olarak geçirmeniz gerektiğinde "this" i kullanın . Aksi halde kullanmak için bir neden yoktur, çünkü kapsam zincirine dayalı bir değişkeni çözümleyebilmenin, onunla nitelendirilen değişkenlerin gereksiz olması gerektiği kadar açık olması gerekir.

DÜZENLEME: "this" ile ilgili C # belgeleri, "this" anahtar sözcüğü için - bahsettiğim iki öğenin yanı sıra - bir daha kullanımı belirtiyor - dizin oluşturucuları bildirmek için

DÜZENLEME: @Juan: Ha, ifadelerimde herhangi bir tutarsızlık görmüyorum - "this" anahtar sözcüğünü (C # belgelerinde belgelendiği gibi) kullanacağım 3 örnek var ve bunlar gerçekten ihtiyacınız olan zamanlar . Hiçbir gölgeleme olmadığında bir kurucudaki değişkenlerin önüne "bu" yapıştırmak, tuş vuruşlarının israfı ve onu okurken zamanımın kaybıdır, fayda sağlamaz.


21
@ JasonBunting : Bazen bir şey yapamaz ve bazı diğerleri ... o karıştıran değil ... Ben ben asla iş umut senin kodunda İleride kodunuzu okuyan bir kişinin sizi anlayacak olabilir her zaman değil Asume o yazdı, olabildiğince açık olmalısın ve bunu başarmanın bir yolu tutarlı olmaktır
juan

@juan, 10 yıl sonra. Hala "bu" kullanmak iyi bir uygulama olduğunu mu düşünüyorsun? :)
Scott Adams

2
@ScottAdams Hala tutarlılık ve netlik inanıyorum, evet
juan

Bir değişkenin kapsamını (yerel veya üye değişken olsun) yalnızca ona bakarak belirlemeye ne dersiniz? 'Bu' bu amaç için haklı değil mi? Veya daha küçük yöntemler yazarsak, değişkenin kapsamını anlamanın yeterince kolay olacağını mı söylemek istersiniz?
BornToCode

27

StyleCop bana her söylediğinde kullanıyorum . StyleCop'a uyulmalıdır. Oh evet.


1
Ve ReSharper kullanmamamı söylüyor. Hem StyleCop hem de ReSharper'ı aynı anda kullandığımda biraz kafa karıştırıcı :) Ama Corey'nin yukarıdaki cevaba eğildiğimde, 'bu' anahtar kelimeyi sadece kesinlikle gerekli olduğunda kullanmak için eğilmiştim.
Gunnar

@Gunnar, gereksiz "bu" kurtulmak için bir seçenek var. in R #
Kanat oyuncusu Sendon

@EmperorAiman ​​- Evet, biliyorum. Demek istediğim, bu iki popüler biçimlendirme aracının varsayılan olarak iki farklı şey olduğunu ve bunun kafa karıştırıcı olabileceğiydi. "Olmak ya da olmamak ..." :)
Gunnar

11

Geçerli nesneye başvurmanız gerektiğinde.

Özellikle kullanışlı bir senaryo, nesnenizin bir işlevi çağırması ve kendini bu işleve iletmek istemesidir.

Misal:

void onChange()
{
    screen.draw(this);
}

7

Her yerde de kullanma eğilimindeyim, sadece uğraştığımız örnek üyelerin açık olduğundan emin olmak için.


5

Belirsizlik olabileceği her yerde kullanıyorum (açıkçası). Sadece derleyici belirsizliği değil (bu durumda gerekli olacaktır), aynı zamanda koda bakan birisi için de belirsizlik.


5

Bu anahtar kelime için bir başka nadir kullanım, uygulayıcı sınıfın içinden açık bir arabirim uygulaması çağırmanız gerektiğidir. İşte örnek bir örnek:

class Example : ICloneable
{
    private void CallClone()
    {
        object clone = ((ICloneable)this).Clone();
    }

    object ICloneable.Clone()
    {
        throw new NotImplementedException();
    }
}

4

İşte bunu kullanıyorum:

  • Sınıftan Özel Yöntemlere Erişim (farklılaştırmak için)
  • Geçerli nesneyi başka bir yönteme iletme (veya bir olay olması durumunda gönderen nesne olarak)
  • Uzantı yöntemleri oluştururken: D

Bu özel alanlar için kullanmıyorum çünkü özel alan değişken adları alt çizgi (_) ile önek.


4

[C ++]

"Gerektiğinde kullan" tugayı kabul ediyorum. Kodu gereksiz yere bu şekilde süslemek harika bir fikir değildir, çünkü derleyici bunu yapmayı unuttuğunuzda sizi uyarmaz. Bu, bunun her zaman orada olmasını bekleyen insanlar için potansiyel karışıklık getirir , yani düşünmek zorunda kalacaklar .

Peki, ne zaman kullanırsın? Ben sadece bazı rastgele kod etrafında bir göz vardı ve bu örnekleri bulundu (Bunları yapmak ya da başka türlü iyi şeyler olup olmadığına karar vermiyorum):

  • "Kendinizi" bir işleve geçirmek.
  • Bir işaretçiye veya bunun gibi bir şeye "kendiniz" atama.
  • Döküm, yani yukarı / aşağı döküm (güvenli veya başka türlü), sabitliği dökmek vb.
  • Derleyici zorla çıkarmaya zorladı.

3

Her zaman kullanmalısınız, özel alanları ve parametreleri ayırmak için kullanmalıyım (çünkü adlandırma kurallarımız üye ve parametre adları için önek kullanmadığımızı belirtmektedir (ve bunlar internette bulunan bilgilere dayanmaktadır, bu yüzden bir en iyi pratik))


3

Aynı türden bir nesneye başvuru kabul eden bir işlevde, hangi nesneye, nereye atıfta bulunduğumu mükemmel bir şekilde açıklamak istiyorum .

Örneğin

class AABB
{
  // ... members
  bool intersects( AABB other )
  {
    return other.left() < this->right() &&
           this->left() < other.right() &&

           // +y increases going down
           other.top() < this->bottom() &&
           this->top() < other.bottom() ;
  }
} ;

(vs)

class AABB
{
  bool intersects( AABB other )
  {
    return other.left() < right() &&
           left() < other.right() &&

           // +y increases going down
           other.top() < bottom() &&
           top() < other.bottom() ;
  }
} ;

Bir bakışta hangi AABB'ye right()atıfta bulunuyor? thisBir berraklaştırıcıdan biraz ekler.


3

Jakub Šturc'un cevabında, yapılandırıcılar arasında veri aktarma konusundaki # 5'i muhtemelen küçük bir açıklama kullanabilirdi. Bu, aşırı yük kurucularında ve kullanımının thiszorunlu olduğu tek durumdur . Aşağıdaki örnekte, parametresiz yapıcıyı parametresiz yapıcıdan varsayılan bir parametreyle çağırabiliriz.

class MyClass {
    private int _x
    public MyClass() : this(5) {}
    public MyClass(int v) { _x = v;}
}

Bunu zaman zaman özellikle kullanışlı bir özellik olarak buldum.


2

Visual C ++ 'da liberal olarak kullanma alışkanlığım var çünkü bunu yapmak'> 'tuşuna bastığım IntelliSense olanları tetikleyecek ve tembelim. (ve yazım hatalarına eğilimli)

Ama kullanmaya devam ettim, çünkü küresel bir fonksiyondan ziyade bir üye fonksiyonunu çağırdığımı görüyorum.


1

_ İle alanları altını çizme eğilimindedir, bu yüzden bunu hiç kullanmanıza gerek yok. Ayrıca R # onları yine de yeniden düzenleme eğilimindedir ...


1

Ben hemen hemen sadece kullanmak bu aynı tip içinden bir tür özelliği başvuru yaparken. Başka bir kullanıcı belirtildiği gibi onlar ihtiyaç duymadan fark edilir bu yüzden, aynı zamanda yerel alanları altını bu .


1

Tek argüman polimorfizmi nedeniyle bir tarafın yöntemlerine konulması gereken simetrik işlemler dışında sadece gerektiğinde kullanıyorum:

boolean sameValue (SomeNum other) {
   return this.importantValue == other.importantValue;
} 

1

[C ++]

Bu , çoğu zaman garip (kasıtsız, tehlikeli veya program için sadece zaman kaybı) şeyleri kontrol etmeniz ve önlemeniz gereken atama işlecinde kullanılır:

A a;
a = a;

Ödev operatörünüz yazılacak:

A& A::operator=(const A& a) {
    if (this == &a) return *this;

    // we know both sides of the = operator are different, do something...

    return *this;
}

1

this C ++ derleyicisinde

C ++ derleyicisi hemen bulmazsa bir sembolü sessizce arar. Bazen, çoğu zaman iyidir:

  • alt sınıfta aşırı yüklemediyseniz, ana sınıf yöntemini kullanarak.
  • bir türün değerini başka bir türe yükseltmek

Ancak bazen, derleyicinin tahmin etmesini istemezsiniz. Derleyicinin başka bir sembolü değil, doğru sembolü almasını istiyorsunuz.

Benim için o zamanlar, bir yöntem içinde bir üye yöntemine veya üye değişkenine erişmek istediğim zamandır. Sadece printfbunun yerine yazdığım için rastgele sembollerin alınmasını istemiyorum print. this->printfderlemezdim.

Mesele şu ki, C eski kütüphaneleri (§), yıllar önce yazılmış eski kodlar (§§) veya kopyala / yapıştırmanın eski fakat hala aktif bir özellik olduğu bir dilde ne olabilir, bazen derleyiciye oynamamasını söyler fikir harika bir fikir.

Kullandığım nedenler bunlar this.

(§) benim için hala bir tür gizem, ama şimdi kaynağınıza <windows.h> başlığını eklediğinizin, tüm eski C kütüphaneleri sembollerinin küresel ad alanınızı kirletmesinin nedeni olup olmadığını merak ediyorum

(§§) "bir başlık eklemeniz gerekiyor, ancak bu başlığı dahil etmenin kodunuzu kıracağından, genel bir adla aptal bir makro kullandığından" farkına varmak, kodlayıcının hayatındaki Rus rulet anlarından biridir


1

'bu.' 'bu' sınıftaki üyeleri çok sayıda üyeyle bulmaya yardımcı olur (genellikle derin bir miras zincirinden dolayı).

CTRL + Space tuşlarına basmak bu konuda yardımcı olmaz, çünkü türleri de içerir; 'bu' olarak. SADECE üyeleri içerir.

Sonra ne olduğumu bir kez ben genellikle silmek: ama bu sadece benim tarzı kırma.

Tarz açısından, yalnız bir korucuysanız - karar verirsiniz; Bir şirket için çalışıyorsanız şirket politikasına sadık kalın (kaynak kontrolündeki öğelere bakın ve diğer insanların ne yaptığını görün). Üyeleri hak kazanmak için kullanma açısından, ikisi de doğru ya da yanlış değildir. Tek yanlış şey tutarsızlıktır - bu tarzın altın kuralıdır. Nit toplama başkalarını bırakın. Bunun yerine zamanınızı gerçek kodlama problemlerini düşünerek ve açıkça kodlayarak düşünün.


1

Her fırsatta kullanıyorum. Kodun daha okunabilir hale geldiğine ve daha okunabilir kodun daha az hataya ve daha fazla sürdürülebilirliğe eşit olduğuna inanıyorum.


1

Aynı kod tabanı üzerinde çalışan birçok geliştirici olduğunuzda, bazı kod yönergelerine / kurallarına ihtiyacınız vardır. Çalıştığım yerde 'this' i alanlar, mülkler ve etkinlikler üzerinde kullanmak istedik.

Bana göre bunu yapmak mantıklı, sınıf değişkenleri ve yöntem değişkenleri arasında ayrım yaptığınızda kodun okunmasını kolaylaştırıyor.


0

Altında çalıştığım kodlama standardına bağlı. Bir örnek değişkenini belirtmek için _ kullanırsak, "bu" gereksiz olur. _ Kullanmıyorsak, bunu örnek değişkenini göstermek için kullanma eğilimindeyim.


0

Bunu JohnMcG gibi Intellisense'i çağırmak için kullanıyorum , ama geri döndüm ve işim bittiğinde "this->" i sileceğim. Ben üye değişkenleri "m_" ile önek Microsoft kuralına uyuyorum, bu yüzden belge olarak bırakmak sadece gereksiz olacaktır.


0

1 - Ortak Java ayarlayıcı deyimi:

 public void setFoo(int foo) {
     this.foo = foo;
 }

2 - Bu nesneyle bir işlevi parametre olarak çağırırken

notifier.addListener(this);

0

C ++ 'da daha önce bahsedilmemiş bir kullanım vardır ve bu, kendi nesnesine atıfta bulunmak veya alınan bir değişkenden bir üyeyi belirsizleştirmek değildir.

thisBağımlı olmayan bir adı, diğer şablonlardan devralan şablon sınıflarının içindeki bağımsız değişken bağımlı bir ada dönüştürmek için kullanabilirsiniz .

template <typename T>
struct base {
   void f() {}
};

template <typename T>
struct derived : public base<T>
{
   void test() {
      //f(); // [1] error
      base<T>::f(); // quite verbose if there is more than one argument, but valid
      this->f(); // f is now an argument dependent symbol
   }
}

Şablonlar iki geçişli bir mekanizma ile derlenir. İlk geçiş sırasında, yalnızca bağımsız değişkene bağımlı olmayan adlar çözümlenir ve denetlenirken, bağımlı adlar, şablon bağımsız değişkenlerini gerçekten değiştirmeden yalnızca tutarlılık açısından denetlenir.

Bu adımda, türü gerçekten değiştirmeden, derleyicinin ne base<T>olabileceğine dair neredeyse hiçbir bilgisi yoktur (temel şablonun uzmanlaşmasının, onu tamamen farklı türlere, tanımsız türlere dönüştürebileceğini unutmayın), bu yüzden bunun yalnızca bir tür olduğunu varsayar. . Bu aşamada, fprogramcı için doğal görünen bağımlı olmayan çağrı , derleyicinin, derivedörnekte bulunmayan ad alanlarının bir üyesi veya kapalı olarak bulması gereken bir simgedir ve şikayet edecektir.

Çözüm, bağımlı olmayan adı bağımlı bir ada fdönüştürmektir. Bu açıkça uygulandığı türü (belirterek, birkaç yönden yapılabilir base<T>::f--adding base<T>üzerinde sembol bağımlı kılan Tve derleyici sadece mevcut ve olacağı üstlenecek erteledi sonra ikinci geçiş için fiili kontrolü, argüman ikamesi.

İkinci yol, birden fazla argümanı veya uzun adı olan şablonlardan miras alırsanız çok daha sıralayıcı this->, sembolün önüne bir ekleme yapmaktır. Uyguladığınız şablon sınıfı bir bağımsız değişkene bağlı olduğundan (miras devralı olduğu base<T>) this->bağımsız değişkene bağımlıdır ve aynı sonucu alırız: this->fşablon parametresi değiştirildikten sonra ikinci turda kontrol edilir.


-2

Kesinlikle zorunlu olmadıkça "bu" kullanmamalısınız.

Gereksiz ayrıntılarla ilişkili bir ceza vardır. Tam olarak olması gerektiği sürece ve artık gerekli olmayan kod için çaba göstermelisiniz.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.