Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > .NET для новичков > C# | Delegates


Автор: VOX 30.11.2009, 12:33
Здравствуйте дорогие участники конференции!
У меня возник вопрос по языку C#.
Вопрос касается такой возможности как делегаты.
Я умею с помощью этого инструмента ссылкаться
на ф-ии, но как я помню, делегаты являются
неким подобием указателей из с++, с помощью
указателей можно было ссылаться на переменные,
т.е. взять адрес переменной из памяти, можно ли
выполнить подобное на С#.
Спасибо!

Автор: tol05 30.11.2009, 12:44
да, можно. Делегаты - это стандартный тип данных в CLR (на равне с классами, структурами, интерфейсами...). Можно объявить тип делегата и использовать этот тип как и любой другой параметр метода 

Код

private delegate string MyDel(string s, double d);

void MyMethod(MyDel del, int i)
{
    del("hello", 0.8);
}


http://www.rsdn.ru/article/dotnet/delegat.xml

Автор: Skynin 30.11.2009, 12:51
Цитата

Я умею с помощью этого инструмента ссылкаться на ф-ии

В C# нет функций. Хотя их можно эмулировать с помощью статических методов.

Цитата

но как я помню, делегаты являются неким подобием указателей из с++

Да, некое подобие с "указателем на функцию" есть. Но делегат умеет хранить больше одного "указателя", и хранит еще и ссылку на объект, у которого нужно вызывать метод. 

Цитата
 с помощью указателей можно было ссылаться на переменные, т.е. взять адрес переменной из памяти, можно ли
выполнить подобное на С#.

В C# нет адресной арифметики. Переменные делятся на 2 вида - "значения" и "ссылочные". Для первых есть частные случаи получения адреса, например при передаче в метод по ссылке (модификаторы ref и out). Ссылочные переменные и так - ссылки.
Есть возможность создания неуправляемых секций кода, но нужно это крайне редко.

Совет - забудьте на время аналогии с С++, и изучайте С# как свой первый язык программирования в жизни. Аналогии с С++ только запутают, это весьма разные языки, только на вид похожие.(ну и потому что императивные и объектно-ориентированные)

Автор: VOX 30.11.2009, 12:55
Я всё понял, спасибо! +++

Добавлено через 3 минуты и 49 секунд
хотя вот хотел бы уточнить...
Код


int integer = 5;


каким образом можно вывести через делегат на консоль
значение переменной integer?

Автор: mrbrooks 30.11.2009, 13:14
Код

  delegate void Delegate(int i);
  static void Func(int i)
  {
    Console.WriteLine(i);
  }
  static void Main()
  {
   Delegate dlg = new Delegate( Func);
   dlg(100);
  }


up
Цитата(VOX @  30.11.2009,  12:55 Найти цитируемый пост)
каким образом можно вывести через делегат на консоль
значение переменной integer?

но в чем прикол?   smile 

Автор: VOX 30.11.2009, 14:16
да думал нюанс какой-ть есть интересный!
Спасибо!
Но вот по этой ссылкеhttp://forum.vingrad.ru/forum/topic-281990/anchor-entry2033726/0.html на топик этого же форума,
нашел у парня в коде:
Код

unsafe
{
var pointer = new IntPtr(&tmpbuff);
Marshal.Copy(buffer, 0, pointer, 4);
}

т.е. я могу в коде сишарп использовать
указатели???

Автор: Exai1e 30.11.2009, 14:23
VOX, unsafe это не безопасный код, можно но не желательно
http://msdn.microsoft.com/ru-ru/library/chfa2zb8.aspx

Автор: Skynin 30.11.2009, 14:28
Цитата

т.е. я могу в коде сишарп использовать указатели???

"Есть возможность создания неуправляемых секций кода, но нужно это крайне редко."

Изучайте C#, а не С++!

Автор: Экскалупатор 30.11.2009, 14:32
Цитата

т.е. я могу в коде сишарп использовать
указатели??? 


VOX, а для чего? нет, я понимаю для чего они нужны в C/C++, но для чего они вам?

Автор: ДобренькийПапаша 30.11.2009, 14:48
Цитата(Skynin @ 30.11.2009,  12:51)
Цитата

Я умею с помощью этого инструмента ссылкаться на ф-ии

В C# нет функций. Хотя их можно эмулировать с помощью статических методов.

Почему нет? В смысле есть только методы? Если так, то поясните, пожалуйста, какая разница между функцией и методом в контексте платформы .NET.
Ибо я много в какой литературе встречал мнение, что эти понятия идентичны. Их иногда различают, но крайне редко. 

Автор: mrbrooks 30.11.2009, 14:52
Цитата(VOX @  30.11.2009,  14:16 Найти цитируемый пост)
т.е. я могу в коде сишарп использовать
указатели??? 

можно, но как правило, не нужно. 

up
Цитата(Экскалупатор @  30.11.2009,  14:32 Найти цитируемый пост)
VOX, а для чего? нет, я понимаю для чего они нужны в C/C++, но для чего они вам? 

это побочный результат перехода с С++ на С#.  smile 

Автор: VOX 30.11.2009, 15:08
да, это так сказать аклиматизация ))) но гражданство всё же будет двойным )))
Всем спасибо за ответы!

Автор: Skynin 30.11.2009, 15:26
Цитата

Если так, то поясните, пожалуйста, какая разница между функцией и методом в контексте платформы .NET.

1. В метод неявно передается ссылка на объект.
2. Выбор метода может осуществляться во время выполнения (virtual), а не компиляции.

Цитата
Ибо я много в какой литературе встречал мнение, что эти понятия идентичны. Их иногда различают, но крайне редко. 

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

Вы какую-то не такую литературу читаете smile

Есть в инете:
Х. Дейтел - C# в подлиннике. Наиболее полное руководство (классического типа учебник, до занудства. По уровню вопросов - рекомендую начинать с него)
Эндрю Троелсен Язык программирования С# 2008 и платформа .NET 3.5 (для начинающего вполне сойдет и ранняя версия по С# 2005 .NET 2.0) (рассказано не только о самом языке программирования, но и о структуре самой CLR .NET и об основных классах и семействах стандартной библиотеки)

Если прочтете хотя бы по диагонали, то многие, в том числе и эти, вопросы отпадут.


Автор: KelTron 30.11.2009, 15:56
Цитата(Skynin @  30.11.2009,  15:26 Найти цитируемый пост)

1. В метод неявно передается ссылка на объект.
2. Выбор метода может осуществляться во время выполнения (virtual), а не компиляции.


Значит static метод всё же функция...всегда забавляли эти названия - функции, функции члены, методы..)

Автор: ДобренькийПапаша 30.11.2009, 16:42
Я читал Троелсена и много чего читал, и считаю, что методы и функции одно и тоже. Те кто хотят видеть отличия должны всегда указывать это явно. В общем случае это одно и тоже. IMHO. (Если так Дейтел считает, то пусть считает и дальше, я не против   smile ).

Автор: Skynin 30.11.2009, 16:53
Цитата

Значит static метод всё же функция...

Да, все есть CALL

Цитата

Я читал Троелсена и много чего читал, и считаю, что методы и функции одно и тоже.

3. Метод может изменить состояние объекта, ссылка на который неявно передана. 
4. Внутри метода действуют правила доступности для полей объекта.

А то что Вы считаете - дело такое. "Я знаю что такое секс, я читала" Новодворская  smile 

Многие считают что знают С++, при этом используя его как Си с классами. И что с того?
Контрольный вопрос на котором студенты на собеседовании спотыкаются:
А есть ли отличия ссылок и указателей в С++, или это просто слова разные - и все 4ре года просиживания в ВУЗе сразу видны.

Так и с делегатами - "указателями на функции".
Не понял что такое делегаты и на тебе утечки памяти.

Цитата

В общем случае это одно и тоже.

Как раз в общем случае и разное - см. мои 4ре пункта.
А вот частный случай: метод с модификатором static - функция.

Вобщем от неграмотности Ваши выводы и непонимание различий.
Хотите научиться - научитесь. Хотите бравировать неграмотным пониманием - так и не будете понимать.

Автор: ДобренькийПапаша 30.11.2009, 18:52
Различия между указателями и ссылками понятны, конечно. Я понял какую разницу вы подразумеваете под методом и функцией.
Но тем не менее, ну не знаю, соглашусь всё-таки наверно, что различать эти понятия имеет смысл smile 

p.s. Я как-то не заострял внимание на этом различии, здесь дело терминологии. Может ли это на что-то серьёзно повлиять? Не заостряя внимания на этом различии, всё что до этого читал и прошу заметить делал, всё было понятно)))

Автор: Skynin 30.11.2009, 21:13
Цитата

Различия между указателями и ссылками понятны, конечно

А ссылка не частный ли случай указателя?
И почему же - конечно? Из моего опыта собеседований - очень даже многие - не понимают.

Цитата

Я как-то не заострял внимание на этом различии, здесь дело терминологии. 

Терминология рождается из понимания различий, а не - придумал профессор словечко.
Если не понимаешь различий - то действительно, какая разница между потенциальной и кинетической энергией? 
А между "энергией" понимаемой физиком и "энергией" понимаемой экстрасенсом - уверены что нет разницы?
Или - между "заражением крови" и "сепсисом"? 

Поэтому подумайте - почему специалисты прибегают к терминологии, а неспециалисты вполне обходятся бытовой речью. (тоже кстати - а что за термин - бытовая?)

Цитата
Может ли это на что-то серьёзно повлиять

На карьеру - собеседование без понимания терминологии не пройдете.
На осознанное применение возможностей языка программирования - гадкий код будет вполне оценен как гадкий, со всеми вытекающими последствиями, хотя программа - работает.

Цитата

Не заостряя внимания на этом различии, всё что до этого читал и прошу заметить делал, всё было понятно

Ну тогда вместо разъяснений, в которых Вы явно не нуждаетесь, исходя из "все было понятно" (мне и сейчас многое непонятно, прямо завидую)
- А кто такие проститутки? - спрашивает 5летняя Маша
- Это такие женщины что одеваются в розовое и целуют мужчин за деньги - опытно отвечает 7летняя Таня.
И все им понятно.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)