Страницы

Поиск по вопросам

понедельник, 24 февраля 2020 г.

Значение this в С#

#c_sharp


Не могу разобраться в сути this.
Когда метод вызывается, ему автоматически передается ссылка на вызывающий
объект, т.е. тот объект, для которого вызывается данный метод

 class SomeClass
{    
    private string name = "No name";   
    private static void WriteToLog(SomeClass aSomeObject)
    {
        Console.WriteLine("Обрабатывается объект с именем " + aSomeObject.name);
    }   

    public SomeClass(string name)
    {
        //Хотим присвоить значение аргумента, полю класса
        this.name = name;
    }    

    public void DoWork()
    {
        WriteToLog(this);       
    }    

}


А что передается в WriteToLog(this) при его вызове? Ссылка на что?

т.е. при 

SomeClass tmpObj = new SomeClass("Иван");


tmpObj.DoWork();


передается ссылка на объект tmpObj ?
    


Ответы

Ответ 1



MSDN The this keyword refers to the current instance of the class and is also used as a modifier of the first parameter of an extension method. Ключевое слово this указывает на текущий экземпляр класса. Также используется в качестве модификатора для первого параметры в методах расширениях. Таким образом внутри определения класса - это ссылка на конкретный объект, для которого выполняется тот или иной метод. SomeClass tmpObj = new SomeClass("Иван"); tmpObj.DoWork(); this внутри DoWork в данном случае указывается на tmlObj, так как эта функция вызывается у этого объекта.

Ответ 2



Кратко о ключевом слове this из MSDN: Ключевое слово this ссылается на текущий экземпляр класса, а также используется в качестве модификатора первого параметра метода расширения. Часто используется при инициализации/реинициализации полей класса из его-же методов. Вот простой пример: class Test{ public string name; string alias; public Employee(string name, string alias) { this.name = name; this.alias = alias; } } В данном примере используя this вы получаете доступ к текущему экземляру класса (проще: класс обращается сам к себе). Поэтому this.name в этом примере - это поле класса, а name - параметр функции. Надеюсь я ответил на ваш вопрос. Удачи!

Ответ 3



Добавлю к остальным ответам, что this используется для создания индексаторов. class CustomMatrix {... public double this[int row, int col { get { ... return arrayToStoreMtxData[row,col]; } }... } Обращение: Console.WriteLine("Value is " + mtxInstance[1,2]);

Ответ 4



Для того, чтобы не было необходимости в конструкторе класса использовать this, придумали использовать нижнее подчеркивание вначале имен приватных полей, тогда _name = name; P.S. Спустя почти год дополню свой ответ следующим. Рекомендую к просмотру отличнейший курс: Making Your C# Code More Object-oriented "Несколько лет назад на собеседовании меня спросили о принципах ООП и интервьюер ожидал от меня услышать то, о чем написано во всех книгах по ООП: инкапсуляция, абстракция, наследование и полиморфизм. Но я ответил, что гораздо важнее понимать на чем основано или на чем зиждутся все эти принципы ООП - это две фундаментальные идеи: указатель this и Dynamic Dispatch." Understanding this Pointer -Silently passed with a call to an instance-level function Function then operate on an object Каждая функции несет в себе ссылку на объект, в котором она оперирует -Bringing operations close to data No more global functions Таким образом ООП в отличие от структурного программирования уходит от глобальных функций Operations have become the quality of data structures Данные и соответсвующие им действия следуют вместе друг с другом Understanding Dynamic Dispatch -Object's duty To carry data about its type Каждый объект несет в себе метаданные о своем типе -Type's duty To keep track of its virtual functions table Каждый тип несет в себе таблицу виртуальных функций To override some functions from its base type -Runtime's duty Среда выполнения динамически определяет какую функцию следует вызывать Jump in when call is placed on an object Find V-table of its generating type Find concrete function address

Комментариев нет:

Отправить комментарий