Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Асинхронные делегаты C#

Модерирует : ShIvADeSt

 Версия для печати • ПодписатьсяДобавить в закладки

Открыть новую тему     Написать ответ в эту тему

Vladimirll

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Здравствуйте ! Подскажите пожалуйста, (программа рабочая ) для чего в методе
 public bool Factorize строки :
 
 
if (m1 == 1) return false;
             
         else return true;
 
 
 
Они в методе ничего не делают и их запись выглядит как формальность, но и без них метод не работает ? Никак не могу понять их предназначение .
 
 
 
// Листинг 10.11. Асинхронные делегаты  Pavlovs_243
 
 using System;
 using System.Threading;
 using System.Runtime.Remoting.Messaging;
                                          // асинхронный делегат
 public delegate bool AsyncDelegate( int Num, out int m1, out int m2 );
 
                 // класс, выполняющий разложение числа на множители
 public class Factorizer
 {
    public bool Factorize( int Num, out int m1, out int m2 )
    {  
        m1 = 1; m2 = Num;
        for (int i = 2; i < Num; i++)        
            if (Num % i == 0) { m1 = i; m2 = Num / i; break; }          
       
 
         if (m1 == 1) return false;
             
         else return true;
         
    }
 }
 
                        // класс, получающий делегата и результаты
 public class PNum
 {
    private int Number;
    public PNum( int number ) {  Number = number;  }
 
   // [OneWayAttribute()]
                               // метод, получающий результаты
 
//       public void Res( IAsyncResult ar )
//       {
//          int m1, m2 ;
                              // получение делегата из AsyncResult  
//          AsyncDelegate ad = (AsyncDelegate)((AsyncResult)ar).AsyncDelegate;
 
                 // получение результатов выполнения метода Factorize  
//          ad.EndInvoke( out m1, out m2, ar );
                             //  вывод результатов
         
//          Console.WriteLine( "Первый способ : множители {0} : {1} {2}",
//                           Number, m1, m2 );
//        }
 }
 // демонстрационный класс  
 
 public class Simple
 {
               
 
          // используется ожидание окончания выполнения  
     public void Num2()
     {
         Factorizer f = new Factorizer();
         AsyncDelegate ad = new AsyncDelegate( f.Factorize );
 
         int Num = 650, tmp;    //  1000589023
 
              // создание экземпляра класса, который будет вызван  
              // после завершения работы метода Factorize
         PNum n = new PNum( Num );
 
             // задание делегата метода обратного вызова  
 //        AsyncCallback callback = new AsyncCallback( n.Res );
 
             // асинхронный вызов метода Factorize  
         IAsyncResult ar = ad.BeginInvoke(
                           Num, out tmp, out tmp, null, null );
                          // ожидание завершения
         ar.AsyncWaitHandle.WaitOne( 10000, false );
         if ( ar.IsCompleted )
         {
             int m1, m2;
                 // получение результатов выполнения метода Factorize  
             ad.EndInvoke( out m1, out m2, ar );
                                             // вывод результатов
             Console.WriteLine("Второй способ :  множители {0} : {1} {2}", Num, m1, m2);
         }
     }
 
     public static void Main( )
     {
         Simple s = new Simple();
        // s.Num1();
         s.Num2();
         Console.ReadKey();
     }
 }

Всего записей: 66 | Зарегистр. 07-07-2015 | Отправлено: 10:43 22-03-2016
Alexzzy

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Цитата:
Они в методе ничего не делают  

Нихрена себе ничего не делают. Return это главное у функции.

Всего записей: 1474 | Зарегистр. 10-07-2013 | Отправлено: 14:08 22-03-2016
Vladimirll

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Alexzzy
Дествие происходит при разложении числа на множители, соответственно и получение результата:
 
 for (int i = 2; i < Numa; i++)        
            if (Numa % i == 0) { m1 = i; m2 = Numa / i; break; }  
 
А вот это :
 
 if (m1 == 1) return false;
             
 else          return true;
 
выглядит в методе     public bool Factorize    как формальность, довески ничего не делающие, поэтому и возникает недоумение. Допустим, можно ли сделать так, чтобы не было этих 2-х строк ???  :
 
     if (m1 == 1) return false;
             
         else return true;
 
 

Всего записей: 66 | Зарегистр. 07-07-2015 | Отправлено: 14:22 23-03-2016
Benchmark



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Vladimirll

Цитата:
выглядит в методе     public bool Factorize    как формальность, довески ничего не делающие

Как же ничего не делающие ?
 
Метод Factorize возвращает false если разложение не найдено и число оказалось простым и true, если число успешно разложено на два множителя (которые будут сохранены в m1 и m2).
 
AsyncDelegate - это всего лишь делегат метода Factorize, он имеет те же аргументы и тот же тип (bool) возвращаемого значения. Делегат для ничего не возвращающей функции был бы void:
public delegate void AsyncDelegate(...

Всего записей: 7000 | Зарегистр. 01-10-2002 | Отправлено: 17:05 23-03-2016
Vladimirll

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Benchmark
 
 
Спасибо !!!  Для меня важно понять этот момент, вроде просто, а с логикой не получается.
 
 

Цитата:
Метод Factorize возвращает false если разложение не найдено и число оказалось простым и true

 
 
А как сделать, чтобы вернулось false  ???  Пробовал в программе, не получается.  
Подскажите, пожалуйста !

Всего записей: 66 | Зарегистр. 07-07-2015 | Отправлено: 15:19 24-03-2016
Benchmark



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Vladimirll

Цитата:
А как сделать, чтобы вернулось false  ???

Очень просто - дать функции в качестве аргумента простое число (у которого нет делителей кроме единицы и самого числа). Например число 1000589021.

Всего записей: 7000 | Зарегистр. 01-10-2002 | Отправлено: 19:26 24-03-2016
Открыть новую тему     Написать ответ в эту тему

Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Асинхронные делегаты C#


Реклама на форуме Ru.Board.

Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
Modified by Ru.B0ard
© Ru.B0ard 2000-2025

LiteCoin: LgY72v35StJhV2xbt8CpxbQ9gFY6jwZ67r

Рейтинг.ru