none
Бинарная операция класса RRS feed

  • Вопрос

  • Добрый день или ночь, всем кто сейчас здесь!!!

    Кто сможет дословно обьяснить как происходит бинарная операция (+) ? 
    В данном примере:

    namespace ConsoleApplication136
    {
        class SafeArray
        {
            int[] a;
            int length;
    
            public SafeArray(int size)
            {
                a = new int[size];
                length = size;
            }
    
            public SafeArray(params int[] arr)
            {
                length = arr.Length;
                a = new int[length];
                for (int i = 0; i < length; ++i)
                    a[i] = arr[i];
            }
    
            public static SafeArray operator +(SafeArray x, SafeArray y)
            {
                int len = x.length < y.length ? x.length : y.length;
                SafeArray temp = new SafeArray(len);
    
                for (int i = 0; i < len; ++i) temp[i] = x[i] + y[i];
                return temp;       
            }
    
            public static SafeArray operator ++(SafeArray x)
            {
                SafeArray temp = new SafeArray(x.length);
                for (int i = 0; i < x.length; ++i) temp[i] = ++x.a[i];
                return temp;
            
            }
    
            public int this[int i]
            {
                get
                {
                    if (i >= 0 && i < length) return a[i];
                    else throw new IndexOutOfRangeException();
                }
                set
                {
                    if (i >= 0 && i < length) a[i] = value;
                    else throw new IndexOutOfRangeException();
                
                }
            }
    
            public void Print(string name)
            {
                Console.WriteLine(name + ":");
                for (int i = 0; i < length; ++i)
                    Console.Write("\t" + a[i]);
                Console.WriteLine();
            }
        }
    
    
        class Programm
        {
            static void Main()
            {
                try
                {
                    SafeArray a1 = new SafeArray(5, 2, -1, 1, -2);
                    a1.Print("Массив 1");
    
                    SafeArray a2 = new SafeArray(1, 0, 3);
                    a2.Print("Массив 2"); a1++;
    
                    SafeArray a3 = a1 + a2; // обяснить дословно как 
                                                       // происходит операция +
                    a3.Print("Сумма массивов 1 и 2");
                }
                catch (Exception e)
                {
                    Console.WriteLine(e.Message);
                }
            }
        }
    }
    PS Все остальные операции мне понятны, мне нужно разобратся в бинарной операции (+)
    • Перемещено Siddharth Chavan 1 октября 2010 г. 22:44 MSDN Forums Consolidation (От:Visual C#)
    8 января 2010 г. 5:17

Ответы

Все ответы

  • public static SafeArray operator +(SafeArray x, SafeArray y)
    {
        //x={6,3,0,2,-1}
        //y={1,0,3}
        int len = x.length < y.length ? x.length : y.length;//Для нового объекта берем наименьшую длину исходных объектов
        SafeArray temp = new SafeArray(len);//Создаем новый объект
    
        for (int i = 0; i < len; ++i) temp[i] = x[i] + y[i];//По элементно складываем {6+1, 3+0, 0+3}
        return temp;//Возврашаем объект с полями length=3 и массивом a={7,3,3}      
    }
    
    8 января 2010 г. 6:37
  • public static SafeArray operator +(SafeArray x, SafeArray y)
    
    {
    
        //x={6,3,0,2,-1}
    
        //y={1,0,3}
    
        int len = x.length < y.length ? x.length : y.length;//Для нового объекта берем наименьшую длину исходных объектов
    
        SafeArray temp = new SafeArray(len);//Создаем новый объект
    
    
    
        for (int i = 0; i < len; ++i) temp[i] = x[i] + y[i];//По элементно складываем {6+1, 3+0, 0+3}
    
        return temp;//Возврашаем объект с полями length=3 и массивом a={7,3,3}      
    
    }
    
    
    
    

    Вопрос следующий:
    temp[i] = x[i] + y[i];//По элементно складываем {6+1, 3+0, 0+3}
    
    Как в этом выражении Складываются элементы массива через имя параметра? - вот это как раз ни очень понятно,
    визуально то я представляю как , а вот до полного разъеснения не дойду ни как
    8 января 2010 г. 6:48
  • Значит  при выполнении x[i] + y[i],    x[i] и y[i] - тоже как и temp[i] обращаются к индексатору?

    8 января 2010 г. 7:00
  • //индексатор (свойство с параметрами)
    public int this[int i]
    {
        get
        {
            if (i >= 0 && i < length) return a[i];//возвращает a[i], если 0<=i<length
            else throw new IndexOutOfRangeException();//иначе исключение
        }
        set
        {
            if (i >= 0 && i < length) a[i] = value;//устанавливает a[i]=value, если 0<=i<length
            else throw new IndexOutOfRangeException();//иначе исключение
                
        }
    }
    
    черех x[i] обращаемся к элементу x.a[i]
    
    
    • Изменено Andrey Revin 8 января 2010 г. 7:05
    8 января 2010 г. 7:01
  • Ну значит через x[i] -происходит обращение к индексатору, который будет выдовать значение элемента массива a[i] по переданному индексу i

    8 января 2010 г. 7:14
  • Не пойму, это вопрос или нет?) Если да, то да :)

    Можете почитать еще
    Использование индексаторов (руководство по программированию в C#)
    • Помечено в качестве ответа Druny 8 января 2010 г. 7:22
    • Снята пометка об ответе Druny 8 января 2010 г. 9:33
    8 января 2010 г. 7:19
  • Зыбыл спросить, Когда мы обращаемся к бинарной операции (+) в этом выражении SafeArray a3 = a1 + a2;
    то имена экземпляров класса a1 и a2 подставляются в параметры SafeArray x и SafeArray y , параметры x и y будут
    иметь разные значения объектов класса SafeArray при каждом выполненом экземпляре класса - ЭТО ТАК????

     

    namespace ConsoleApplication136
    
    {
    
        class SafeArray
    
        {
    
            int[] a;
    
            int length;
    
    
    
            public SafeArray(int size)
    
            {
    
                a = new int[size];
    
                length = size;
    
            }
    
    
    
            public SafeArray(params int[] arr)
    
            {
    
                length = arr.Length;
    
                a = new int[length];
    
                for (int i = 0; i < length; ++i)
    
                    a[i] = arr[i];
    
            }
    
    
    
            public static SafeArray operator +(SafeArray x, SafeArray y)
    
            {
    
                int len = x.length < y.length ? x.length : y.length;
    
                SafeArray temp = new SafeArray(len);
    
    
    
                for (int i = 0; i < len; ++i) temp[i] = x[i] + y[i];
    
                return temp;       
    
            }
    
    
    
            public static SafeArray operator ++(SafeArray x)
    
            {
    
                SafeArray temp = new SafeArray(x.length);
    
                for (int i = 0; i < x.length; ++i) temp[i] = ++x.a[i];
    
                return temp;
    
            
    
            }
    
    
    
            public int this[int i]
    
            {
    
                get
    
                {
    
                    if (i >= 0 && i < length) return a[i];
    
                    else throw new IndexOutOfRangeException();
    
                }
    
                set
    
                {
    
                    if (i >= 0 && i < length) a[i] = value;
    
                    else throw new IndexOutOfRangeException();
    
                
    
                }
    
            }
    
    
    
            public void Print(string name)
    
            {
    
                Console.WriteLine(name + ":");
    
                for (int i = 0; i < length; ++i)
    
                    Console.Write("\t" + a[i]);
    
                Console.WriteLine();
    
            }
    
        }
    
    
    
    
    
        class Programm
    
        {
    
            static void Main()
    
            {
    
                try
    
                {
    
                    SafeArray a1 = new SafeArray(5, 2, -1, 1, -2);
    
                    a1.Print("Массив 1");
    
    
    
                    SafeArray a2 = new SafeArray(1, 0, 3);
    
                    a2.Print("Массив 2"); a1++;
    
    
    
                    SafeArray a3 = a1 + a2; // обяснить дословно как 
    
                                                       // происходит операция +
    
                    a3.Print("Сумма массивов 1 и 2");
    
                }
    
                catch (Exception e)
    
                {
    
                    Console.WriteLine(e.Message);
    
                }
    
            }
    
        }
    
    }
    
    

    8 января 2010 г. 9:30
  • Да

    SafeArray x=a1;
    SafeArray y=a2;


    • Помечено в качестве ответа Druny 8 января 2010 г. 9:55
    8 января 2010 г. 9:42
  • Да

    SafeArray x=a1;
    
    SafeArray y=a2;
    
    



    Спасибо большое за ответы, int A.Revin Медали пользователяМедали пользователяМедали пользователяМедали пользователяМедали пользователя= Хороший человек!!!
    Хорошего тебе дня!!!
    8 января 2010 г. 9:53