Jak wiemy zmienna ma pewien zakres, w którym możemy się nią posługiwać. Co się stanie w przypadku gdy stworzymy zmienną o tym samym typie i nazwie w klasie i metodzie ? Z której zmiennej skorzysta kompilator? Sprawdźmy:

class Program {
        static void Main() {
            PrzykladowaKlasa metoda = new PrzykladowaKlasa();         
            metoda.MetodaTestowaA();
            metoda.MetodaTestowaB();            
        }
    }

    class PrzykladowaKlasa {
        double wynik = 1;
        public void MetodaTestowaA() {
            double wynik = 2;
            Console.WriteLine("Wynik MetodaTestowaA() " + wynik);           
        }

        public void MetodaTestowaB() {            
            Console.WriteLine("Wynik MetodaTestowaB() " + wynik);
            Console.ReadLine();
        }
    }

W przykładzie powyżej istnieje konflikt nazw. Stworzone zostały dwie zmienne takiej samej nazwie i o tym samym typie. Jedna z nich zadeklarowana jest w ciele klasy a druga w ciele metody o nazwie MetodaTestowaA().
Z której zatem zmiennej o nazwie wynik skorzysta MetodaTestowaA()?
Zobaczmy:

Rys. Wyświetlenie wartości dla zamiennej o nazwie wynik

MetodaTestowaA() skorzystała z zmiennej zadeklarowanej w jej ciele. Prześledźmy działanie programu:

Metodzie Main() programu tworzony jest obiekt klasy PrzykładowaKlasa. Podczas tworzenia obiektu zostaje nadana wartość dla pola o nazwie wynik wynosząca 1. Następnie wywołane zostają dwie metody:

Podczas wywołania metody o nazwie MetodaTestotwaA() . Najpierw jest zadeklarowana nowa zmienna o nazwie wynik, nadana zostaje jej wartość wynosząca 2. Następnie metoda wyświetla wartość zmiennej wynik na ekranie. Otrzymaliśmy wynik 2. A więc zmienna z metody zastąpiła tą z klasy.

W metodzie MetodaTestowaB() nie jest zadeklarowana nowa zmienna o nazwie wynik więc wykorzystana zostanie zmienna zadeklarowana w klasie o tej samej nazwie. Dlatego na ekranie wyświetlona została wartość 1 dla zmiennej o nazwie wynik.

A co w przypadku gdy chcemy skorzystać w metodzie z zmiennej zadeklarowanej w klasie ale zmienna z ciała metody ją zastępuje? Wystarczy użyć słowa kluczowego this. Daje ono dostęp do bieżącej instancji klasy, możemy to wykorzystać do rozwiązania problemu z dwuznacznością nazw.
Zobaczmy przykład:

  class Program {
        static void Main() {
            PrzykladowaKlasa metoda = new PrzykladowaKlasa();
            metoda.MetodaTestowaA();
            metoda.MetodaTestowaB();
        }
    }

    class PrzykladowaKlasa {
        double wynik = 1;
        public void MetodaTestowaA() {
            double wynik = 2;
            Console.WriteLine("Wynik MetodaTestowaA() " + this.wynik);
        }

        public void MetodaTestowaB() {

            Console.WriteLine("Wynik MetodaTestowaB() " + wynik);
            Console.ReadLine();
        }
    }

Oto rezultat działania aplikacji:

Rys. Wyświetlenie wartości dla zamiennej o nazwie wynik

Dzięki użyciu słowa kluczowego this zostaje wyświetlona zmienna zadeklarowana w klasie.