ANTICHAT.XYZ    VIDEO.ANTICHAT.XYZ    НОВЫЕ СООБЩЕНИЯ    ФОРУМ  
Баннер 1   Баннер 2

ANTICHAT — форум по информационной безопасности, OSINT и технологиям

ANTICHAT — русскоязычное сообщество по безопасности, OSINT и программированию. Форум ранее работал на доменах antichat.ru, antichat.com и antichat.club, и теперь снова доступен на новом адресе — forum.antichat.xyz.
Форум восстановлен и продолжает развитие: доступны архивные темы, добавляются новые обсуждения и материалы.
⚠️ Старые аккаунты восстановить невозможно — необходимо зарегистрироваться заново.
Вернуться   Форум АНТИЧАТ > Программирование_OLD > С/С++, C#, Delphi, .NET, Asm
   
 
 
Опции темы Поиск в этой теме Опции просмотра

  #121  
Старый 01.04.2009, 15:05
procedure
Banned
Регистрация: 22.12.2007
Сообщений: 660
Провел на форуме:
3885269

Репутация: 1158


По умолчанию

Немного дополню:

Делегат содержит 2 поля:

1. Ссылка на объект.
2. указатель на метод.

Если 1ое поле равно null, метод должен быть статистичеким.

Постараюсь ответить на вопрос MaDfUn
Цитата:
зачем они нужны в реальных проектах?

Если ты проектируешь спамер или флудер для школьников, то впринципе делегаты тебе не нужны. А если ты проектируешь opensource прилолжение, выполняешь важный заказ или просто хочешь чтобы твой код смотрелся красиво нужно использовать делегаты и события. Хотя с .net 2.0 есть еще анонимные методы, а с 3его уже можно использовать лямбда выражения, которые еще больше упрощают процесс понимания сего и проектирования.

Повторю слова Трэй Нэша "В хорошо спроектированной системе, узер интерфейс отделен от логики управления посредством четкой абстрации - обычно реализуемой через шаблон Мост".

Вообще видов делегатов бывают много (обобщеный делегат, делегат закрытого экземпляра, открытого экземпляра, статический делегат, цепочка делегатов).

Вкратце о каждом:

1. Делегат закрытого экземпляра:

Код:
using System;

namespace test
{
    //создаем делегат
    // public - модификатор доступа
    // delegate - делагат ) 
    // int - возвращаемое значение
    // RaiseReputation - тип делегата
    // int - параметры принимающие методом
    public delegate double RaiseReputation(double reputation);
    
    public class AntichatUser
    {
        //Конструктор объекта
        public AntichatUser(double reputation)
        {
            this.reputation = reputation;
        }
        /// <summary>
        /// поднять на %
        /// </summary>
        /// <param name="percent"></param>
        /// <returns></returns>
        public double ApplyRaiseOf(double percent)
        {
            reputation = reputation * (1 + percent);
            Console.WriteLine("reputation: {0}", reputation);

            return reputation;
        }
        // Репутация
        private double reputation;
    }

    public class EntryPoint
    {
        static void Main()
        {
            // Создаем экземпляры классов
            AntichatUser user1 = new AntichatUser(180);
            AntichatUser user2 = new AntichatUser(600);
            AntichatUser user3 = new AntichatUser(920);
            // создаем экземпляры делегата!!!
            RaiseReputation thisDelegate1 = new RaiseReputation(user1.ApplyRaiseOf);
            RaiseReputation thisDelegate2 = new RaiseReputation(user2.ApplyRaiseOf);
            RaiseReputation thisDelegate3 = new RaiseReputation(user3.ApplyRaiseOf);
            //Увеличиваем значение свойства объекта на 80% и выводим результат на консоль
            Console.WriteLine(thisDelegate1(0.8));
            Console.WriteLine(thisDelegate1(0.8));
            // а этому на 60% #-)
            Console.WriteLine(thisDelegate1(0.6));
            //ожидаем активности пользователя
            Console.ReadKey();
        }
    }
}
В самом начале тут, мы создаем делегат, в комментариях описано думаю подробно. Далее мы создаем класс и метод в классе с которым будут работать экземпляры делегатов. Далее все в Main() думаю подробно описано. Единтсвенное что можно добавить это то что мы инициируем вызов метода, методом thisDelegate1(0.8), который в свою очередь принимает параметры точно такого же типа или типа не явно конвертирующегося в тип принимаемый методом ApplyRaiseOf(). Точно так же, экземпляр делегата после этого возвращает нам параметры.
Почему закрытого? Потому что каждый раз делегат выполняется только для экземпляра того класса, который мы указали в параметрах при вызове методы RaiseReputation.

Главное запомнить, что когда мы используем делегат вызывающий метод экземпляра объекта, мы передаем ему так же и текущий экземпляр объекта. Об этом позже, чтоб не вводить тебя в заблуждения.


2. делегат открытого экземпляра

А что если у нас не 3 объекта по отдельности, а 10 в коллекции?

Именно для таких нужд и созданы делегаты открытого типа.

Код:
using System;

namespace test
{
    //создаем делегат
    // public - модификатор доступа
    // delegate - делагат ) 
    // int - возвращаемое значение
    // RaiseReputation - тип делегата
    // int - параметры принимающие методом
    public delegate double RaiseReputation(AntichatUser user, double reputation);
    
    public class AntichatUser
    {
        //Конструктор объекта
        public AntichatUser(double reputation)
        {
            this.reputation = reputation;
        }
        /// <summary>
        /// поднять на %
        /// </summary>
        /// <param name="percent"></param>
        /// <returns></returns>
        public double ApplyRaiseOf(double percent)
        {
            reputation *= (1 + percent);
            Console.WriteLine("reputation: {0}", reputation);

            return reputation;
        }
        // Репутация
        private double reputation;
    }

    public class EntryPoint
    {
        static void Main()
        {
            // Создаем коллекцию и помещаем туда экземпляры
            System.Collections.Generic.List<AntichatUser> users =
                new System.Collections.Generic.List<AntichatUser>();
            users.Add(new AntichatUser(100));
            users.Add(new AntichatUser(590));
            users.Add(new AntichatUser(980));

            // Итак, тут немного дуаю будет сложно разобратся, - помогу. 
            // Мы создаем экземпляр MethodInfo
            // далее мы безопасно получаем тип класса AntichatUser
            // (то же что и Type type = new Type(тра ля ля); 
            // Далее вызываем метод GetMethod() первым параметром 
            // которого является название метода, вторым это 
            // прявязки так называемые. На основе которых будет подбираться метод
            // Public и Instance в данном случае значит что все pulic члены так же должны быть включены.
            System.Reflection.MethodInfo info =
                typeof(AntichatUser).GetMethod("ApplyRaiseOf",
                        System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.Instance);

            // Тут создание экземпляра делегата, мы доверяем методу CreateDelegate()
            RaiseReputation iAmDelegate =
                (RaiseReputation)Delegate.CreateDelegate(typeof(RaiseReputation), info);

            //Повышаем всем на 80% репутацию. 
            foreach (AntichatUser user in users)
                iAmDelegate(user, 0.8);

            //ожидаем активности пользователя
            Console.ReadKey();
        }
    }
}
В комментариях все подробно описано.

3. Статически делегат.

Тоже самое что делегат закрытого типа. Только метод который стоит в указателе делагата на объект, является статистическим. т.е. 1ое поле у него null, а второе ссылка на *статистический* метод.


4. Обобщенный делегат, в точности такой же как делегат закрытого типа. За исключением того что он работает с обобщенными типами <T>.

пример:
Код:
    public delegate double RaiseReputation<T>(<T> reputation);
Если мы не хотим поймать экскепшн, мы должны в нашем методе это предусмотреть.
Думаю такая логика идиоту понятна, поэтому демонстрировать не буду)

------

Но я бы тебе пососветовал не останавливатся на делегатах и взглянуть на события.
 

  #122  
Старый 02.04.2009, 02:00
[x26]VOLAND
Moderator - Level 7
Регистрация: 07.06.2006
Сообщений: 556
Провел на форуме:
7549607

Репутация: 2702


Отправить сообщение для [x26]VOLAND с помощью ICQ Отправить сообщение для [x26]VOLAND с помощью AIM
По умолчанию

Цитата:
foreach (AntichatUser user in users)
iAmDelegate(user, 0.8);
Помоему вот так:
[I]for (int i = 0; i < users.Count; iAmDelegate(users, 0.8));
быстрее и красивее )
 

  #123  
Старый 02.04.2009, 14:17
geezer.code
Reservists Of Antichat - Level 6
Регистрация: 22.01.2007
Сообщений: 616
Провел на форуме:
7452489

Репутация: 1359


По умолчанию

Цитата:
Сообщение от [x26]VOLAND  
Помоему вот так:
[I]for (int i = 0; i < users.Count; iAmDelegate(users, 0.8));
быстрее и красивее )
красивее и быстрее - да, но читаемость кода ухудшается.

читаемость точно хуже , в первый раз даже не заметил что нет ++!

Последний раз редактировалось geezer.code; 04.04.2009 в 00:36..
 

  #124  
Старый 07.04.2009, 03:23
.ATK
Участник форума
Регистрация: 20.02.2009
Сообщений: 224
Провел на форуме:
5075819

Репутация: 274
По умолчанию

Киньте кто кусок рабочего кода работы System.Net.Mail.SmtpClient! А то при отправке (.Send()) выдаёт ошибку!
 

  #125  
Старый 07.04.2009, 12:55
geezer.code
Reservists Of Antichat - Level 6
Регистрация: 22.01.2007
Сообщений: 616
Провел на форуме:
7452489

Репутация: 1359


По умолчанию

Цитата:
Сообщение от .ATK  
Киньте кто кусок рабочего кода работы System.Net.Mail.SmtpClient! А то при отправке (.Send()) выдаёт ошибку!
заглянем в мсдн, а там.... ух ты! готовый код!
Код:
using System;
using System.Net;
using System.Net.Mail;
using System.Net.Mime;
using System.Threading;
using System.ComponentModel;
namespace Examples.SmptExamples.Async
{
    public class SimpleAsynchronousExample
    {
        static bool mailSent = false;
        private static void SendCompletedCallback(object sender, AsyncCompletedEventArgs e)
        {
            // Get the unique identifier for this asynchronous operation.
             String token = (string) e.UserState;

            if (e.Cancelled)
            {
                 Console.WriteLine("[{0}] Send canceled.", token);
            }
            if (e.Error != null)
            {
                 Console.WriteLine("[{0}] {1}", token, e.Error.ToString());
            } else
            {
                Console.WriteLine("Message sent.");
            }
            mailSent = true;
        }
        public static void Main(string[] args)
        {
            // Command line argument must the the SMTP host.
            SmtpClient client = new SmtpClient(args[0]);
            // Specify the e-mail sender.
            // Create a mailing address that includes a UTF8 character
            // in the display name.
            MailAddress from = new MailAddress("jane@contoso.com", 
               "Jane " + (char)0xD8+ " Clayton", 
            System.Text.Encoding.UTF8);
            // Set destinations for the e-mail message.
            MailAddress to = new MailAddress("ben@contoso.com");
            // Specify the message content.
            MailMessage message = new MailMessage(from, to);
            message.Body = "This is a test e-mail message sent by an application. ";
            // Include some non-ASCII characters in body and subject.
            string someArrows = new string(new char[] {'\u2190', '\u2191', '\u2192', '\u2193'});
            message.Body += Environment.NewLine + someArrows;
            message.BodyEncoding =  System.Text.Encoding.UTF8;
            message.Subject = "test message 1" + someArrows;
            message.SubjectEncoding = System.Text.Encoding.UTF8;
            // Set the method that is called back when the send operation ends.
            client.SendCompleted += new 
            SendCompletedEventHandler(SendCompletedCallback);
            // The userState can be any object that allows your callback 
            // method to identify this send operation.
            // For this example, the userToken is a string constant.
            string userState = "test message1";
            client.SendAsync(message, userState);
            Console.WriteLine("Sending message... press c to cancel mail. Press any other key to exit.");
            string answer = Console.ReadLine();
            // If the user canceled the send, and mail hasn't been sent yet,
            // then cancel the pending operation.
            if (answer.StartsWith("c") && mailSent == false)
            {
                client.SendAsyncCancel();
            }
            // Clean up.
            message.Dispose();
            Console.WriteLine("Goodbye.");
        }
    }
}
ps вообще неплохо было бы выложить текст ошибки.

pps для тех кто не в курсе как отправляется почта клиент отправляет письмо посредством smtp сервера. возможно смтп сервер будет требовать авторизацию
пример приведен для сервера с открытым релеингом(имя передается в args[0]).
если сервер требует авторизации , ТО также нужно передать credentials
примерно так.
client.Credentials = new NetworkCredential("myemail", "mypassword");

зззы - работайте головой.

Последний раз редактировалось geezer.code; 07.04.2009 в 16:26..
 

  #126  
Старый 11.04.2009, 22:44
KaMiKadZe
Участник форума
Регистрация: 24.02.2006
Сообщений: 206
Провел на форуме:
2735257

Репутация: 103
По умолчанию

Visual C# 2008 при создание проекта выдает ошибку Requested registry access is not allowed. (Стоит Windows 7) как исправить?
 

  #127  
Старый 16.04.2009, 07:53
procedure
Banned
Регистрация: 22.12.2007
Сообщений: 660
Провел на форуме:
3885269

Репутация: 1158


По умолчанию

Столкнулся с проблемой, подскажите пожалуйста, как из объекта Image, получить текстовую строку, содержащую все символы картинки. В текстовом виде. Для того чтобы отправить в запросе.
 

  #128  
Старый 16.04.2009, 10:53
Algol
Регистрация: 29.05.2002
Сообщений: 1,793
Провел на форуме:
2050916

Репутация: 0


По умолчанию

Цитата:
Сообщение от procedure  
Столкнулся с проблемой, подскажите пожалуйста, как из объекта Image, получить текстовую строку, содержащую все символы картинки. В текстовом виде. Для того чтобы отправить в запросе.
image.ToString()
 

  #129  
Старый 16.04.2009, 11:22
procedure
Banned
Регистрация: 22.12.2007
Сообщений: 660
Провел на форуме:
3885269

Репутация: 1158


По умолчанию

Если бы так все легко...))

Цитата:
#10:21 original returned: System.Drawing.Bitmap
 

  #130  
Старый 16.04.2009, 12:27
geezer.code
Reservists Of Antichat - Level 6
Регистрация: 22.01.2007
Сообщений: 616
Провел на форуме:
7452489

Репутация: 1359


По умолчанию

Цитата:
Сообщение от procedure  
Столкнулся с проблемой, подскажите пожалуйста, как из объекта Image, получить текстовую строку, содержащую все символы картинки. В текстовом виде. Для того чтобы отправить в запросе.
http://www.codeproject.com/KB/recipes/ImageConverter.aspx
ну а byteArray я думаю сам справишься.
Код:
public byte[] imageToByteArray(System.Drawing.Image imageIn)
{
 MemoryStream ms = new MemoryStream();
 imageIn.Save(ms,System.Drawing.Imaging.ImageFormat.Gif);
 return  ms.ToArray();
}
public Image byteArrayToImage(byte[] byteArrayIn)
{
     MemoryStream ms = new MemoryStream(byteArrayIn);
     Image returnImage = Image.FromStream(ms);
     return returnImage;
}
 
 



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Обсуждение темы. Форум - Faq. Вопросы и Ответы. Егорыч+++ Правила форума 55 16.06.2010 01:07
Форум - Faq. Вопросы и Ответы. Егорыч+++ Правила форума 0 07.06.2008 18:52



Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
 


Быстрый переход




ANTICHAT.XYZ