в тому шо я можу зробити делегат
і прив'язати до нього будь-який метод з ідентичною сигнатурою????
а як this передавати до метода?
всм який this???
якщо взяти адрес не статичного метода, то це лише адрес метода. він один на усі об'екти даного классу (якщо не віртуальний)
не зрозумів якшо допустимо у мене є клас Person в нього є private string name і метод HelloPerson() => Console.WriteLine($"Hello {this.name}"); далі я зробив об'єкт p1 = new Person("Ladzo"); і викликаю p1.HelloPerson(); причому тут делегати до this??? Я ж можу не один такий об'єкт зробити.... можу і p2 = new Person("Galya"); і викликати p2.HelloPerson(); і тоді буде p2 this
це не так працює. адрес метода це адрес функції. this це лише перший параметр до такої функції. наприклад метод HelloPerson це на справді функція приблизно така void HelloPerson(Persion @this) компілятор сам підставляє @this коли робить виклик. у статичного метода ніяких параметрів немає, і буде void HelloPerson() делегат delegate void HelloDelegate() якраз і має можливість зберігти this щоб програміст не роздумував який конкретно там метод треба викликати. лише передав параметри і забрав результат
Якщо ти подивишся з точки зору рефлексії, ти отримуєш метод з типу typeof(Person).GetMethod(...) І далі викликаєш його, вже передаючи інстанс method.Invoke(instance, params) Тобто самі по собі метадані (MethodInfo) не є прив'язаними до інстансу Те ж саме і при компіляції, десь там підставляється неявно інстанс до інстансо-незалежного опису метода, як сказав Андрій До речі, виклик статичного методу це виклик MethodInfo, де на інстанс ти передаєш null .Invoke(null, params)
Обсуждают сегодня