2015-03-28 4 views
0

является делегатом метод или класс? Если это метод, то почему мы можем его создать? может быть создан только класс , поэтому делегат должен быть классом , пожалуйста, помогите мне Я немного смущен из-за этого и где делегат хранится в куче или стеке?Что происходит в памяти, когда мы объявляем делегата в C#?

+0

Это класс .. https://msdn.microsoft.com/en-us/library/system.delegate (v = vs.110) .aspx –

+1

_ «где делегат хранится в куче или стеке» - это неправильный вопрос. Там, где что-то хранится, очень мало что связано с типом. В частности, типы значений сохраняются везде, где это необходимо, учитывая контекст. Например. поля типа значения ссылочного типа сохраняются в куче, так как фиксируются локальные переменные типа значения (в конце концов они неявно завершаются как поле в ссылочном типе). –

ответ

1

Делегат - это безопасный указатель типа, указывающий на ваши методы/функции. Это означает, что вы можете передавать методы/функции в качестве параметра с помощью делегатов, и это также будет безопасно для типов.

Для получения дополнительной информации проверки this ссылки

0

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

Он определяет подпись метода. Чтобы создать экземпляр, вам необходимо связать его с методом (так что это в основном синтаксический сахар для ссылок на методы с явной подписью).

Он также имеет метод Invoke, который определяется сигнатурой MethodInfo, связанной во время выполнения.

+0

Посмотрите на следующее - http://referencesource.microsoft.com/#mscorlib/system/delegate.cs,f90e13dc7115bc8c. Я не уверен в точности этого ответа. Это, безусловно, можно было бы уточнить ИМХО. –

+0

Конечно, детали реализации не упомянуты, но как это отличается от ответа? Из того, что я вижу в исходном коде ссылки, который вы связали: это класс, у него есть поле MethodInfo (свойство, ok), целевой объект, а у компиляторов есть синтаксический сахар для него. – Jcl

+0

Непонятные мне вещи - 1. Что подразумевается под его типом, но определяется и действует как класс? 2. Утвердите, что у него есть поле MethodInfo. 3. Не уверен, что имеет в виду, что он имеет «информацию о времени выполнения» либо ... или «Он определяет подпись метода» .. или «вам нужно указать с помощью метода». 4. Я бы, конечно, не назвал это синтаксическим сахаром. Это не так. etc ... –

1

Делегат является ссылочным типом, таким же, как класс, и как таковой хранится в куче. Подумайте о делегите как о «стеке» ссылок, который содержит сигнатуры функции/метода.

0

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

Что-то вроде

 public class SomeAction : Delegate 
     { 
       private object _instance; 
       private MethodInfo _method; 
       public void Invoke() 
       { 
       //Invoke 
       } 
      } 

Не совсем так, но что-то похожее на это

Смежные вопросы