#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
Комментариев нет:
Отправить комментарий