Модераторы: Partizan, gambit

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> C# | Delegates 
V
    Опции темы
VOX
Дата 30.11.2009, 12:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 297
Регистрация: 21.1.2009

Репутация: нет
Всего: 1



Здравствуйте дорогие участники конференции!
У меня возник вопрос по языку C#.
Вопрос касается такой возможности как делегаты.
Я умею с помощью этого инструмента ссылкаться
на ф-ии, но как я помню, делегаты являются
неким подобием указателей из с++, с помощью
указателей можно было ссылаться на переменные,
т.е. взять адрес переменной из памяти, можно ли
выполнить подобное на С#.
Спасибо!
PM MAIL   Вверх
tol05
Дата 30.11.2009, 12:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1632
Регистрация: 21.12.2006
Где: Харьков

Репутация: 36
Всего: 170



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

Код

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

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


вот можно почитать


--------------------
На хорошей работе и сны хорошие снятся.
PM MAIL   Вверх
Skynin
Дата 30.11.2009, 12:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 359
Регистрация: 1.7.2007
Где: Харьков

Репутация: 0
Всего: 10



Цитата

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

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

Цитата

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

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

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

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

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

Это сообщение отредактировал(а) Skynin - 30.11.2009, 12:53
PM MAIL WWW ICQ Skype GTalk YIM MSN   Вверх
VOX
Дата 30.11.2009, 12:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 297
Регистрация: 21.1.2009

Репутация: нет
Всего: 1



Я всё понял, спасибо! +++

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


int integer = 5;


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

PM MAIL   Вверх
mrbrooks
Дата 30.11.2009, 13:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


трололомен
****


Профиль
Группа: Завсегдатай
Сообщений: 4259
Регистрация: 4.10.2006
Где: Дол Гулдур

Репутация: 17
Всего: 306



Код

  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 

Это сообщение отредактировал(а) mrbrooks - 30.11.2009, 13:15
PM MAIL   Вверх
VOX
Дата 30.11.2009, 14:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 297
Регистрация: 21.1.2009

Репутация: нет
Всего: 1



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

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

т.е. я могу в коде сишарп использовать
указатели???
PM MAIL   Вверх
Exai1e
Дата 30.11.2009, 14:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 908
Регистрация: 3.12.2006
Где: Moscow

Репутация: 4
Всего: 30



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


--------------------
"Решение зависит от выбранного геморроя" © Snowy
"у нас как в армии - либо работает, либо так и задумано"
PM MAIL ICQ   Вверх
Skynin
Дата 30.11.2009, 14:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 359
Регистрация: 1.7.2007
Где: Харьков

Репутация: 0
Всего: 10



Цитата

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

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

Изучайте C#, а не С++!
PM MAIL WWW ICQ Skype GTalk YIM MSN   Вверх
Экскалупатор
Дата 30.11.2009, 14:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1746
Регистрация: 1.4.2009
Где: г. Минск

Репутация: 5
Всего: 24



Цитата

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


VOX, а для чего? нет, я понимаю для чего они нужны в C/C++, но для чего они вам?
PM MAIL ICQ   Вверх
ДобренькийПапаша
Дата 30.11.2009, 14:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1278
Регистрация: 14.1.2006
Где: г.Москва

Репутация: 3
Всего: 7



Цитата(Skynin @ 30.11.2009,  12:51)
Цитата

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

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

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


--------------------
Меня зовут Себастьян Парейра, торговец чёрным деревом.
PM MAIL   Вверх
mrbrooks
Дата 30.11.2009, 14:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


трололомен
****


Профиль
Группа: Завсегдатай
Сообщений: 4259
Регистрация: 4.10.2006
Где: Дол Гулдур

Репутация: 17
Всего: 306



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

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

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

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

Это сообщение отредактировал(а) mrbrooks - 30.11.2009, 14:53
PM MAIL   Вверх
VOX
Дата 30.11.2009, 15:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 297
Регистрация: 21.1.2009

Репутация: нет
Всего: 1



да, это так сказать аклиматизация ))) но гражданство всё же будет двойным )))
Всем спасибо за ответы!
PM MAIL   Вверх
Skynin
Дата 30.11.2009, 15:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 359
Регистрация: 1.7.2007
Где: Харьков

Репутация: 0
Всего: 10



Цитата

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

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

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

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

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

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

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



Это сообщение отредактировал(а) Skynin - 30.11.2009, 15:29
PM MAIL WWW ICQ Skype GTalk YIM MSN   Вверх
KelTron
Дата 30.11.2009, 15:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 745
Регистрация: 8.10.2006
Где: Красноярск

Репутация: 11
Всего: 38



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

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


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


Это сообщение отредактировал(а) KelTron - 30.11.2009, 15:57


--------------------
Тысячами незримых нитей обвивает тебя Закон. Разрубишь одну - преступник. Десять - смертник. Все - Бог.
Эвенгар Салладорский, основатель Школы Тьмы.
PM MAIL   Вверх
ДобренькийПапаша
Дата 30.11.2009, 16:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1278
Регистрация: 14.1.2006
Где: г.Москва

Репутация: 3
Всего: 7



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

Это сообщение отредактировал(а) ДобренькийПапаша - 30.11.2009, 16:43


--------------------
Меня зовут Себастьян Парейра, торговец чёрным деревом.
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
Partizan
PashaPash

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, Partizan, PashaPash.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | .NET для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0597 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.