Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > .NET Frameworks (точка нет фреймворки) > Общие вопросы .NET
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 13.12.2015, 11:51   #1
hoz
Форумчанин
 
Аватар для hoz
 
Регистрация: 29.06.2013
Сообщений: 132
По умолчанию Об использовании this в параметрах методов

Столкнулся очередной раз с использование this в параметрах методов, и, чутка запутался.
Поиск ничего не дал, кроме порождающих классов. Но это я уже понимаю.
Вот здесь:
Код:
namespace Extension
{
    static class ExtensionClass
    {
        public static void ExtensionMethod(this string value, int counter)
        {
            counter--;
            Console.WriteLine(value + counter);

            if (counter != 0)
                value.ExtensionMethod(counter);

            Console.WriteLine(value + counter);
        }
    }

    class Program
    {
        static void Main()
        {
            string text = "Hello ";

            text.ExtensionMethod(3);

            // Delay.
            Console.ReadKey();
        }
    }
}
Видно, что имеем дело в порождающим паттерном. Вопросов нет.
А вот имеется такой код:
Код:
class Publisher
{
   public void SendMessageTo(Subscriber subscriber)
   {
      subscriber.CallOperationsOn(this);
   }

   public void Operation()
   {
      Console.WriteLine("Выполнена операция");
   }
}
Как правильно интерпретивровать этот код?

Я так понимаю, что, по ходу, через this, в данном случает, передаётся сам родительский класс. Но информации об этом нигде не нашёл. Хочется лучше понять этот момент.

Последний раз редактировалось Stilet; 13.12.2015 в 13:50.
hoz вне форума Ответить с цитированием
Старый 13.12.2015, 12:24   #2
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

Это Extension методы для как бы добавления методов в класс (без наследования), причем тут родительский.

Такой синтаксис у них.

Можете сделать обычный статический метод без this, просто так компилятор добавит возможность более удобного использования.

Код:
string s = "";
s.ExtensionMethod(1);
Но можно и просто как обычный метод вызвать:
Код:
ExtensionClass.ExtensionMethod(s, 1);
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Старый 13.12.2015, 12:30   #3
come-on
Участник клуба
 
Регистрация: 21.10.2015
Сообщений: 1,361
По умолчанию

Цитата:
А вот имеется такой код:
это просто вызов метода, с передачей себя.
Что тут еще думать?
come-on вне форума Ответить с цитированием
Старый 13.12.2015, 15:29   #4
hoz
Форумчанин
 
Аватар для hoz
 
Регистрация: 29.06.2013
Сообщений: 132
По умолчанию

Цитата:
Сообщение от come-on Посмотреть сообщение
это просто вызов метода, с передачей себя.
Что тут еще думать?
Если говорить об:
Код:
class Publisher
{
   public void SendMessageTo(Subscriber subscriber)
   {
      subscriber.CallOperationsOn(this);
   }

   public void Operation()
   {
      Console.WriteLine("Выполнена операция");
   }
}
То здесь мне непонятно, почему this ссылается на сам объект класса Publisher, а не на метод SendMessageTo(...)

Последний раз редактировалось Stilet; 13.12.2015 в 15:33.
hoz вне форума Ответить с цитированием
Старый 13.12.2015, 15:32   #5
hoz
Форумчанин
 
Аватар для hoz
 
Регистрация: 29.06.2013
Сообщений: 132
По умолчанию

Цитата:
Сообщение от Alex11223 Посмотреть сообщение
Это Extension методы для как бы добавления методов в класс (без наследования), причем тут родительский.

Такой синтаксис у них.

Можете сделать обычный статический метод без this, просто так компилятор добавит возможность более удобного использования.

Код:
string s = "";
s.ExtensionMethod(1);
Но можно и просто как обычный метод вызвать:
Код:
ExtensionClass.ExtensionMethod(s, 1);
Этот вариант я понимаю, как раз-таки.
hoz вне форума Ответить с цитированием
Старый 13.12.2015, 15:33   #6
Luuzuk
Форумчанин
 
Аватар для Luuzuk
 
Регистрация: 18.01.2012
Сообщений: 975
По умолчанию

Открой для себя msdn
https://msdn.microsoft.com/ru-ru/library/dk1507sz.aspx
https://msdn.microsoft.com/ru-ru/library/bb383977.aspx
Благодарить в репутацию. Проклинать — туда же
Luuzuk вне форума Ответить с цитированием
Старый 13.12.2015, 15:33   #7
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

Вы о чем? this для ссылки на метод не бывает, зачем он?

И в первом сообщении вообще другая ситуация, гуглите extension methods.
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Старый 13.12.2015, 16:35   #8
come-on
Участник клуба
 
Регистрация: 21.10.2015
Сообщений: 1,361
По умолчанию

Так автора вообще трудно понять, то пишет
Цитата:
Вопросов нет.
А вот имеется такой код:

Как правильно интерпретивровать этот код?
то на него же пишет
Цитата:
здесь мне непонятно
что тогда не понтно?
come-on вне форума Ответить с цитированием
Старый 13.12.2015, 18:06   #9
hoz
Форумчанин
 
Аватар для hoz
 
Регистрация: 29.06.2013
Сообщений: 132
По умолчанию

По сути, я понял всё. Всем огромное спасибо!)
come-on, ну визуально в первом примере был явно в глаза бросающийся расширяющий метод, а то, что я ни сразу понял, был немного не такой.
Сами сравните:
1. Порождающий метод.
Код:
public static void ExtensionMethod(this string value, int counter)
        {
            counter--;
            Console.WriteLine(value + counter);

            if (counter != 0)
                value.ExtensionMethod(counter);

            Console.WriteLine(value + counter);
        }
2. А это тот метод, который я не сразу въехал.
Код:
class Publisher
{
   public void SendMessageTo(Subscriber subscriber)
   {
      subscriber.CallOperationsOn(this);
   }

   public void Operation()
   {
      Console.WriteLine("Выполнена операция");
   }
}
Разницу же сами видите.
В первом варианте, можно посредством объекта, который через параметр передаётся методу, вызывать сам метод, а во-втором, так не сделать. Там лишь передача самого себя другому методу... и всё.

Последний раз редактировалось hoz; 13.12.2015 в 18:13.
hoz вне форума Ответить с цитированием
Старый 13.12.2015, 18:19   #10
come-on
Участник клуба
 
Регистрация: 21.10.2015
Сообщений: 1,361
По умолчанию

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

Последний раз редактировалось come-on; 13.12.2015 в 18:23.
come-on вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Ссылка в параметрах функции Uefa Помощь студентам 2 30.10.2014 19:29
Объявление и определение методов.Напишите функции в виде методов (подпрограмм). Напишите тестирующую программу с выдачей результа Vika_0_0 C# (си шарп) 0 04.10.2012 15:21
Ошибка в использовании методов класса Jugger Общие вопросы C/C++ 2 26.10.2011 01:29
Объекты в параметрах функций romantik2011 PHP 3 28.07.2011 21:07
О параметрах запуска и CreateProcess Человек_Борща Общие вопросы Delphi 2 01.06.2011 10:01