Например, я понимаю, что я не могу передать событие методу или конструктору, но я не понимаю, почему я не могу. Что отличает событие от собрания делегатов?Почему событие не является объектом первого класса в C#
ответ
... в то время как события выглядят как экземпляры делегатов с точки зрения способа выражения операций добавления и удаления, это не так.
События - это пары методов, надлежащим образом оформленные в IL, чтобы связать их вместе и позволить языкам знать, что методы представляют события. Методам соответствуют операции добавления и удаления, каждый из которых принимает параметр экземпляра делегата того же типа (тип события). То, что вы делаете с этими операциями, в значительной степени зависит от вас, но типичным является добавление или удаление делегата из списка обработчиков для события.
Это просто указание, что события не являются объектами первого класса. Вопрос спрашивает, почему они не являются, которые, как предпосылка, предполагают, что это не так. – Servy
@Servy Я думаю, что знание того, что события - это пары методов, каким-то образом объясняет, почему? Если вы тогда захотите узнать, почему они такие, то я бы сказал, что основной причиной является инкапсуляция. Вызов события может выполняться только внутри класса, объявившего это событие. Можно было бы более или менее эмулировать события в C#, имея частный член делегирования с помощью пары общих методов доступа. События в C# дают соответствие этому (а не людям, создающим похожие, но разные способы решения этой проблемы) и добавляют какой-то синтаксический сахар, поэтому мы все можем набрать немного меньше. – withakay
Это оправдывает, почему события имеют поддержку столько, сколько они делают. Вопрос в том, почему он останавливается там и почему вы не можете, например, передать событие в качестве параметра методу. Вы могли бы абсолютно создать язык для этого, учитывая, что событие было инкапсулировано. Ваше оправдание тому, почему события не могут быть поддержаны более глубоко, вместо этого поддерживает то, что они могут быть (хотя никоим образом не рассматривая, почему они не были). – Servy
События, объявлен в классе, чтобы объекты внешних по отношению к классу, чтобы быть прикрепить к событию и получать уведомления об изменениях, происходящих в этом классе.
Если бы это был первый класс гражданин, то событие может быть вызывается из внешнего класса означает, что любой мошенник код со ссылкой на событие, из Button
сказать, может вызвать Click
событие уволят.
Чтобы предотвратить это события имеют особые правила доступа, которые позволяют только класс, который Объявляет событие (и не даже свои собственные подклассы), чтобы запустить событие.
Следовательно, для этой безопасности события не являются первоклассными гражданами .NET Framework.
Хотя я считаю, что ответ @ inakay является технически правильным ответом, я считаю, что ваш гораздо лучший практический пример того, почему вы не можете проходить событие вокруг. –
Это совершенно неверно. Вы можете сделать событие гражданином первого класса, не позволяя им быть вызванным извне этого типа. По этой логике частное поле не должно быть гражданином первого класса, поскольку к нему нельзя получить доступ за пределами класса или к собственному сетевому устройству или к чему-либо еще, имеющему область видимости (т. Е. В основном все). – Servy
@Servy - Я не согласен. События очень разные, чтобы сравнивать их с частными полями. Вы можете передать значение/ссылку частного поля и использовать его со 100% своих функций, но вы не можете сделать это с событием. – Enigmativity
- 1. Почему Guid НЕ является объектом в C#?
- 2. Cout является объектом класса ostream_withassign
- 3. Узнайте, является ли объект объектом класса, а не экземпляром класса
- 4. класса переменной является объектом которым этого класса
- 5. C# событие является пустым
- 6. Почему "undefined является null или не является объектом"?
- 7. Почему эта переменная не является объектом?
- 8. Почему этот лямбда не является единственным объектом?
- 9. $ .fn не является объектом
- 10. Является ли событие целевым объектом или строкой?
- 11. Почему система не поддерживает среды первого класса?
- 12. Почему событие load вызвано с объектом ProgressEvent?
- 13. Laravel не является объектом
- 14. Почему typeof null является «объектом» в javascript?
- 15. Null не является объектом, создающим dropdown
- 16. RUCM - «Модель не является надлежащим объектом класса« SSModel »
- 17. UnpicklingError: аргумент класса NEWOBJ не является объектом типа
- 18. Инициализация статического члена класса, который является другим объектом класса
- 19. PHP 'StdClass не является объектом'
- 20. почему checkboxpreference является нулевым объектом предпочтения
- 21. TypeError: 'undefined' не является объектом
- 22. Почему Backbone.js не является обязательным мое событие
- 23. Почему Тип данных в java не является объектом?
- 24. Почему аргумент функции не является объектом массива в Javascript?
- 25. Если массив Object является объектом, почему массив String не является строкой
- 26. абстрактное событие класса C#
- 27. Почему var_dump() говорит, что строка является объектом?
- 28. Как проверить переменная является объектом класса или не
- 29. Python - Если функция является объектом первого класса, может ли функция иметь метод?
- 30. «документ» является недействительным или не является объектом
@cFrozenDeath Я уверен, что я не понимаю, что такое событие. Если бы я это сделал, я бы не стал задавать этот вопрос. –
Ради будущих читателей вы могли бы добавить фрагмент кода, демонстрирующий это поведение? –