В чем преимущество наличия явного указателя/self-указателя?

В чем преимущество this/self/me указатель обязательный явный?

Согласно теории OOP предполагается, что метод должен работать в основном (только?) по переменным-членам и аргументам метода. После этого должно быть проще ссылаться на переменные-члены, чем на внешние (с точки зрения объекта) переменные... Явный this делает его более подробным, поэтому сложнее для ссылки на переменные-члены, чем на внешние. Это кажется мне интуитивным противником.

Ответ 1

В дополнение к переменным-членам и параметрам метода у вас также есть локальные переменные. Одна из самых важных вещей об объекте - его внутреннее состояние. Явное разграничение имен переменных элементов очень четко указывает, где вы ссылаетесь на это состояние и где вы изменяете это состояние.

Например, если у вас есть код:

someMethod(some, parameters) {
    ... a segment of code
    foo = 42;
    ... another segment of code
}

когда вы быстро просматриваете его, вы должны иметь ментальную модель переменных, определенных в предыдущем сегменте, чтобы знать, является ли она только временной переменной или она мутирует состояние объектов. В то время как this.foo = 42 делает очевидным, что состояние объектов мутировано. И если явное разыменование используется исключительно, вы можете быть уверены, что переменная является временной в противном случае.

Более короткие, хорошо продуманные методы делают его немного менее важным, но, тем не менее, долгосрочная понятность превосходит небольшое удобство при написании кода.

Ответ 3

Что делать, если аргументы метода имеют то же имя, что и переменные-члены? Затем вы можете использовать this.x = x, например. Где this.x - переменная-член, а x - аргумент метода. Это один (тривиальный) пример.

Ответ 4

Вам понадобится передать указатель/ссылку на текущий объект в другом месте или защитить себя от самозадачи в операторе присваивания.

Ответ 5

Обычно я использую это (в С++) только тогда, когда я пишу оператор присваивания или конструктор , поскольку он помогает четко идентифицировать переменные. Другое место, где я могу думать о его использовании, - это то, что ваши имена переменных параметра функции такие же, как имена переменных вашего члена, или я хочу убить свой объект, используя удалить это.

Ответ 6

Например, имена членов будут такими же, как те, которые переданы методу

public void SetScreenTemplate(long screenTemplateID, string screenTemplateName, bool isDefault)
        {
            this.screenTemplateID = screenTemplateID;
            this.screenTemplateName = screenTemplateName;
            this.isDefault = isDefault;
        }