является делегатом метод или класс? Если это метод, то почему мы можем его создать? может быть создан только класс , поэтому делегат должен быть классом , пожалуйста, помогите мне Я немного смущен из-за этого и где делегат хранится в куче или стеке?Что происходит в памяти, когда мы объявляем делегата в C#?
ответ
Делегат - это безопасный указатель типа, указывающий на ваши методы/функции. Это означает, что вы можете передавать методы/функции в качестве параметра с помощью делегатов, и это также будет безопасно для типов.
Для получения дополнительной информации проверки this ссылки
Делегата концептуально типа, но он определен и действует как класс (с MethodInfo
собственности, экземпляром -или мишени, и некоторых методами й выполнением информация и т. д.).
Он определяет подпись метода. Чтобы создать экземпляр, вам необходимо связать его с методом (так что это в основном синтаксический сахар для ссылок на методы с явной подписью).
Он также имеет метод Invoke
, который определяется сигнатурой MethodInfo
, связанной во время выполнения.
Посмотрите на следующее - http://referencesource.microsoft.com/#mscorlib/system/delegate.cs,f90e13dc7115bc8c. Я не уверен в точности этого ответа. Это, безусловно, можно было бы уточнить ИМХО. –
Конечно, детали реализации не упомянуты, но как это отличается от ответа? Из того, что я вижу в исходном коде ссылки, который вы связали: это класс, у него есть поле MethodInfo (свойство, ok), целевой объект, а у компиляторов есть синтаксический сахар для него. – Jcl
Непонятные мне вещи - 1. Что подразумевается под его типом, но определяется и действует как класс? 2. Утвердите, что у него есть поле MethodInfo. 3. Не уверен, что имеет в виду, что он имеет «информацию о времени выполнения» либо ... или «Он определяет подпись метода» .. или «вам нужно указать
Делегат является ссылочным типом, таким же, как класс, и как таковой хранится в куче. Подумайте о делегите как о «стеке» ссылок, который содержит сигнатуры функции/метода.
Делегат - это всего лишь тип, похожий на класс, который он выделяет память в куче, и экземпляр для вызова его. И переменная делегата содержит ссылку на этот объект.
Что-то вроде
public class SomeAction : Delegate
{
private object _instance;
private MethodInfo _method;
public void Invoke()
{
//Invoke
}
}
Не совсем так, но что-то похожее на это
- 1. Что происходит, когда мы объявляем Array (4) в JavaScript?
- 2. Что происходит в памяти, если мы просто объявляем переменную без инициализации в java?
- 3. В PHP, что происходит в памяти, когда мы используем mysql_query
- 4. Что действительно делает компилятор, когда мы объявляем статические переменные?
- 5. Что происходит в памяти, когда я использую ссылки в C++?
- 6. Что происходит, когда мы меняем значение строки в C++
- 7. Что происходит, когда мы произвольно используем ==?
- 8. Что происходит, когда мы создаем объект интерфейса?
- 9. c: распределение памяти (что происходит)
- 10. Что происходит, когда мы переписываем существующий файл?
- 11. Что происходит, когда мы делаем видимую свойство ложной
- 12. Что происходит, когда мы перезаряжаем модули Elixir?
- 13. Что происходит, когда мы запускаем класс PHP?
- 14. Что происходит, когда мы делаем networkstream.write()?
- 15. Что происходит, когда мы вызываем $ (document) .ready()
- 16. Что происходит, когда мы называем IUknown :: Release
- 17. Что происходит под капотом, когда мы представляемViewController?
- 18. можно инициализировать свойство коллекции, когда мы объявляем его в классе
- 19. Почему происходит переполнение стека, если мы не объявляем наш буфер как глобальную переменную в C?
- 20. Что происходит, когда мы вызываем метод ArrayList.add()?
- 21. Что происходит, когда мы перезаписываем cv :: Mat.data
- 22. Что происходит, когда мы вызываем ServiceWorkerRegistration.pushManager.subscribe()?
- 23. Что происходит, когда мы используем updatepanel?
- 24. Что происходит, когда мы разыскиваем указатель FILE?
- 25. Что происходит внутри, когда мы делаем downcasting?
- 26. Что происходит, когда мы пишем [Obj autorelease] в пуле Autorelease?
- 27. Что именно происходит, когда мы пишем window.open()?
- 28. Что именно происходит, когда мы используем ajax
- 29. Что происходит, когда мы обновляем веб-страницу?
- 30. Что происходит, когда мы вызываем requestLocationUpdates()?
Это класс .. https://msdn.microsoft.com/en-us/library/system.delegate (v = vs.110) .aspx –
_ «где делегат хранится в куче или стеке» - это неправильный вопрос. Там, где что-то хранится, очень мало что связано с типом. В частности, типы значений сохраняются везде, где это необходимо, учитывая контекст. Например. поля типа значения ссылочного типа сохраняются в куче, так как фиксируются локальные переменные типа значения (в конце концов они неявно завершаются как поле в ссылочном типе). –