#c# #.net #static #delegates
#c# #.net #статический #делегаты
Вопрос:
Это выдает ошибку компилятора:
public static delegate void SomeCoolDelegate();
Почему?
Комментарии:
1. Ты пытаешься сделать так, чтобы этот делегат можно использовать только для вызова статических методов?
2. @Джастин: предположим, что да. 🙂
Ответ №1:
Это не имеет никакого значения для делегата; я имею в виду, семантически, это все равно, что сказать, что я никогда не хочу реализацию этого метода signature!
Вы могли бы объявить реализацию как статическую…
protected static SomeCoolDelegate SomeMethod { get; set; }
Когда вы помечаете класс как статический, вы говорите, что никогда не захотите создавать его экземпляр. Делегат — это просто способ идентификации сигнатуры метода.
Комментарии:
1. Я не понимаю. Вы можете пометить классы как статические, чтобы сказать, что мне никогда не нужна реализация этого класса. Что плохого в том, чтобы пометить делегат как статический, сказать «Я всегда хочу, чтобы каждый экземпляр этого делегата был статическим»?
2. Интересный вопрос; однако сигнатура метода определяется не его статичностью; только входные переменные, общее объявление и тип вывода. Я не думаю, что существует способ сказать «только статические методы».
Ответ №2:
Объявление a delegate
— это объявление типа. Делегаты в C # не могут быть созданы static
. Если вы хотите объявить переменную типа delegate, вам следует сделать что-то вроде этого:
public delegate void SomeCoolDelegate(); // declare a type called SomeCoolDelegate
public static SomeCoolDelegate foo; // declare foo as an object of type SomeCoolDelegate
Комментарии:
1. Это неверно. Вы можете объявлять статические классы, и фактически, это одно из требований к созданию метода расширения.
2. Гейб: Спасибо, я знал это, но по какой-то причине он не щелкнул. Теперь я чувствую себя глупо. LOL Я ценю разъяснение / напоминание.
Ответ №3:
Объявление делегата — это объявление типа. Это имеет очень мало значения, поскольку для типа, который содержит только методы экземпляра, которые должны быть объявлены статическими.
Ответ №4:
Хорошо, я думаю, что происходит следующее:
Объявление делегата на самом деле просит компилятор создать для вас новый специальный класс. Задача этого класса — действовать как указатель на функцию (или несколько указателей на функцию, если необходимо).
Компилятор выполнит свои обязательства, создав новый класс по мере того, как вы будете указывать все, что вам нужно для выполнения вашей работы с делегатом. Он продолжит работу и создаст этот класс, но все, что вы получаете, — это методы и свойства уровня экземпляра и т.д.
Таким образом, объявление делегата как статического бессмысленно (как указывали JaredPar и другие). Вы говорите: «Дайте мне статический класс, в котором все элементы не являются статическими (и, следовательно, недоступны) и т.д. и т.п.». Это не имеет смысла.
Ответ №5:
Делегат — это тип, с точки зрения времени выполнения тип — это просто классификация хранилища данных, например, папки, содержащей элементы, нет смысла делать тип статическим, потому что тип в любом случае статичен. Член любого типа может быть статическим.
C # давайте напишем static для класса, чтобы ограничить разработчика писать только статические элементы в type, но это не означает, что этот тип является или не является статическим.