none
Зачем нужен this ? RRS feed

  • Вопрос

  • полтора года изучаю си шарп, но так и не понимаю зачем же нужен this?

    если я работаю в форме, то форма и так знает о своих свойствах. зачем же лишний раз говорит: "Эй ты, да именно ты, тут всё равно больше никого нет, сделай вот это...." 

    • Перемещено Abolmasov Dmitry 20 ноября 2012 г. 8:49 (От:Изба болтальня)
    17 ноября 2012 г. 23:56

Ответы

  • Значит вы еще не сталкивались с ситуациями когда задача не решалась без этого ключевого слова.

    Вот вам пример из страницы справочника по C#

    public Employee(string name, string alias)
    {
        // Use this to qualify the fields, name and alias:
        this.name = name;
        this.alias = alias;
    }

    То есть когда в классе имеется процедура, которая принимает параметры с таким же именем как уже имеется в классе для четкого разделения этих имен используется this. Вы конечно можете стараться избегать задания одинаковых имен, но это зачастую не удобно. Ведь если вам нужно принимать в процедуре значение например левого отступа, то Left самое понятное для этого имя. Плюс вы никуда не денетесь от одинаковых имен при переопределении имеющихся методов класса, так как разработчики в большинстве своем не избегают использования одинаковых имен.

    Я сам на VB пишу, но суть четко понимаю, так как она в обоих языках одинакова (в VB используется слово Ме). К слову я видел здесь очень много кода на C# и практически все используют явную ссылку повсеместно, просто из удобства восприятия кода другими.


    Женат на WPF. Тайно встречаюсь с WinRT. Не сложилось с C#!

    • Предложено в качестве ответа YatajgaEditor 18 ноября 2012 г. 6:11
    • Помечено в качестве ответа Abolmasov Dmitry 20 ноября 2012 г. 14:48
    18 ноября 2012 г. 6:07
    Отвечающий
  • Также, ключевое слово this может использоваться для вызова перегруженного конструктора:

    class Person
    {
        public string Name { get; private set; }
        public Person(string p_name)
        {
            Name = p_name;
        }
        public Person() : this("Noname") { }
    }
    static void Main(string[] args)
    {
        Person ivan = new Person("Иван");
        Console.WriteLine(ivan.Name);
        Person unknow = new Person();
        Console.WriteLine(unknow.Name);
        Console.ReadKey();
    }

    • Помечено в качестве ответа Abolmasov Dmitry 20 ноября 2012 г. 14:48
    20 ноября 2012 г. 7:12
    Отвечающий
  • Также, ключевое слово this может использоваться для вызова перегруженного конструктора


    А ещё, если нужно передать объект в какой-то метод. Но речь-то шла не о this в принципе, а о вызове одних методов объекта из других методов того же объекта. Хоть об этом и не сказано явно, но всё-таки понятно из контекста : "Эй ты, да именно ты, тут всё равно больше никого нет, сделай вот это...."
    • Помечено в качестве ответа Abolmasov Dmitry 20 ноября 2012 г. 14:48
    20 ноября 2012 г. 8:58
  • а я ещё this использую чтобы было виднее, что работаю с экземпляром типа,
    а не с локальной переменной (пусть даже пришедшей из параметра метода).
    просто синим подсвечивает, и сразу понятно что к чему по контрасту.
    • Изменено INFEL8 20 ноября 2012 г. 13:14
    • Помечено в качестве ответа Abolmasov Dmitry 20 ноября 2012 г. 14:48
    20 ноября 2012 г. 13:13

Все ответы

  • Значит вы еще не сталкивались с ситуациями когда задача не решалась без этого ключевого слова.

    Вот вам пример из страницы справочника по C#

    public Employee(string name, string alias)
    {
        // Use this to qualify the fields, name and alias:
        this.name = name;
        this.alias = alias;
    }

    То есть когда в классе имеется процедура, которая принимает параметры с таким же именем как уже имеется в классе для четкого разделения этих имен используется this. Вы конечно можете стараться избегать задания одинаковых имен, но это зачастую не удобно. Ведь если вам нужно принимать в процедуре значение например левого отступа, то Left самое понятное для этого имя. Плюс вы никуда не денетесь от одинаковых имен при переопределении имеющихся методов класса, так как разработчики в большинстве своем не избегают использования одинаковых имен.

    Я сам на VB пишу, но суть четко понимаю, так как она в обоих языках одинакова (в VB используется слово Ме). К слову я видел здесь очень много кода на C# и практически все используют явную ссылку повсеместно, просто из удобства восприятия кода другими.


    Женат на WPF. Тайно встречаюсь с WinRT. Не сложилось с C#!

    • Предложено в качестве ответа YatajgaEditor 18 ноября 2012 г. 6:11
    • Помечено в качестве ответа Abolmasov Dmitry 20 ноября 2012 г. 14:48
    18 ноября 2012 г. 6:07
    Отвечающий
  • всегда  в таких примерах писал без this и всегда прокатывала

    18 ноября 2012 г. 9:52
  • всегда  в таких примерах писал без this и всегда прокатывала

    Ответ на ваш вопрос я вам дал, а вот использовать this или нет дело ваше. Разработчиков не принято загонять в узкие рамки и всегда есть возможность пойти по разному пути - в этом и прелесть программирования.


    Женат на WPF. Тайно встречаюсь с WinRT. Не сложилось с C#!

    18 ноября 2012 г. 9:55
    Отвечающий
  • Не всегда обязательно нужно применять что-то, лишь потому, что оно есть. Всегда хорошо, когда есть возможность выбора, а остальное зависит от стиля.
    18 ноября 2012 г. 10:00
    Модератор
  • Также, ключевое слово this может использоваться для вызова перегруженного конструктора:

    class Person
    {
        public string Name { get; private set; }
        public Person(string p_name)
        {
            Name = p_name;
        }
        public Person() : this("Noname") { }
    }
    static void Main(string[] args)
    {
        Person ivan = new Person("Иван");
        Console.WriteLine(ivan.Name);
        Person unknow = new Person();
        Console.WriteLine(unknow.Name);
        Console.ReadKey();
    }

    • Помечено в качестве ответа Abolmasov Dmitry 20 ноября 2012 г. 14:48
    20 ноября 2012 г. 7:12
    Отвечающий
  • Также, ключевое слово this может использоваться для вызова перегруженного конструктора


    А ещё, если нужно передать объект в какой-то метод. Но речь-то шла не о this в принципе, а о вызове одних методов объекта из других методов того же объекта. Хоть об этом и не сказано явно, но всё-таки понятно из контекста : "Эй ты, да именно ты, тут всё равно больше никого нет, сделай вот это...."
    • Помечено в качестве ответа Abolmasov Dmitry 20 ноября 2012 г. 14:48
    20 ноября 2012 г. 8:58
  • а я ещё this использую чтобы было виднее, что работаю с экземпляром типа,
    а не с локальной переменной (пусть даже пришедшей из параметра метода).
    просто синим подсвечивает, и сразу понятно что к чему по контрасту.
    • Изменено INFEL8 20 ноября 2012 г. 13:14
    • Помечено в качестве ответа Abolmasov Dmitry 20 ноября 2012 г. 14:48
    20 ноября 2012 г. 13:13