Хелпикс

Главная

Контакты

Случайная статья





Пример 1.. Пример 2. 



Пример 1.

using System;

class Test {

    public int a, b;

      public Test() { }

public Test(int i, int j) { // конструктор

       a = i;

       b = j;

}

public void NoChange(ref int i, int j, out double frac) {

       frac = (double) (i + j)/2;

        i = i + j;

        j = -j;             

}

 

public void Change(Test ob) { // ссылочный параметр

      ob.a = ob.a + ob.b;

      ob.b = -ob.b;

}

}

 

class CallByValue {

    static void Main() {

          Test ob = new Test();

          int a = 15, b = 20; double f;

          Console.WriteLine ("а и b до вызова: " + a + " " + b); //15 2 0

          ob.NoChange(ref a, b, outf);

          Console.WriteLine("а, b и f после вызова: " + a + " " + b + " " + f); // 35 20 22,5

 

          Test ob1 = new Test(15, 20);

          Console.WriteLine("ob1.a и ob1.b до вызова: " + ob1.a +" "+ ob1.b); // 15 20

          ob1.Change(ob1);

          Console.WriteLine("ob1.a и ob1.b после вызова: " + ob1.a + " " + ob1.b); // 35 -20

}

}

 

Применение модификаторов ref и out не ограничивается только передачей значений обычных типов. С их помощью можно также передавать ссылки на объекты. Если модификатор ref или out указывает на ссылку, то сама ссылка передается по ссылке. Это позволяет изменить в методе объект, на который указывает ссылка.

 

Пример 2. 

using System;

class RefSwap {

  int a, b;

   public RefSwap(int i, int j) { // конструктор

      a = i;

      b = j;

  }

   public void Show() {

        Console.WriteLine ("a: {0}, b: {1}", a, b);

  }

   // Этот метод изменяет свои аргументы,

   public void Swap(ref RefSwap ob1, ref RefSwap ob2) {

        RefSwap t;

        t = ob1;

        ob1 = ob2;

        ob2 = t;

}

}

class RefSwapDemo {

  static void Main() {

      RefSwap x = new RefSwap(1, 2);

      RefSwap у = new RefSwap(3, 4);

      Console.Write("x до вызова: ");

      x.Show();                                       // х до вызова: а: 1, b: 2

      Console.Write("у до вызова: ");

      у. Show ();                                     // у до вызова: а: 3, b: 4

 

     Console.WriteLine ();

       // Смена объектов, на которые ссылаются аргументы х и у.

     х.Swap(ref x, ref у);

     Console.Write("х после вызова: ");

     х.Show();                                        // х после вызова: а: 3, b: 4

     Console.Write("у после вызова: ");

     у.Show();                                        // у после вызова: а: 1, b: 2

}

}

В методе Swap() выполняется смена объектов, на которые ссылаются два его аргумента. До вызова метода Swap() аргумент х ссылается на объект, содержащий значения 1 и 2, тогда как аргумент у ссылается на объект, содержащий значения 3 и 4. А после вызова метода Swap() аргумент х ссылается на объект, содержащий значения 3 и 4, тогда как аргумент у ссылается на объект, содержащий значения 1 и 2. Если бы не параметры типа ref, то перестановка в методе Swap() не имела бы никаких последствий за пределами этого метода.

 



  

© helpiks.su При использовании или копировании материалов прямая ссылка на сайт обязательна.