Passing in the function one-dimensional and multidimensional arrays of class instances as ref and out parameters
Contents
- 1. Features of passing references to arrays of class instances using ref and out modifiers
- 2. Passing a one-dimensional array of type int as a ref parameter. Example
- 3. Passing a one-dimensional array of class instances as an out-parameter. Example
- 4. Passing a two-dimensional array of class instances as a ref-parameter. Example
- Related topics
Search other websites:
1. Features of passing references to arrays of class instances using ref and out modifiers
There are 2 ways to pass references to arrays of class instances to a function:
- passing parameter by value. In this case, the array is completely copied to the function. Changing the values of an array inside a function will not change these values in the calling code;
- passing parameter by reference. In this case, ref or out modifiers are used. When passing a value by reference, you can change the number of items in the array, reallocate memory for each item, and fill these items of the array with new values.
So, when passing an array with ref or out modifiers:
- You can change the value of the reference itself. This means that you can reallocate memory for the array and its items and fill in the array items with new values;
- the change in the values of the array elements inside the function will be displayed in the calling code.
⇑
2. Passing a one-dimensional array of type int as a ref parameter. Example
The following example develops an Integer class that contains one internal value parameter.
The following items are declared in the tested class Program:
- static function GetArray(), forming an array of random numbers of type Integer. The function receives as input parameter an array A of type Integer[] as a ref parameter and reallocates memory for the reference A. The function reallocates memory for any instance and fills the instance fields with values. Changing values is fixed in the calling function main();
- static function SumIntegers() – designed to calculate the sum of the integer values of an array of type Integer. The function receives an array of type Integer[] as a ref-reference.
After the program terminates, there is no need to free memory (as in C++). The memory will be freed automatically during the so-called “garbage collection”.
using System; namespace ConsoleApp2 { // Class Integer - reference type class Integer { public int value; } class Program { // Static function GetArray() forms an array of random numbers, // the array is passed as a ref parameter, you can change A itself static void GetArray(ref Integer[] A) { // 1. Initialize random number generator Random rnd_num = new Random(); // 2. Change the number of items in array A - reallocate memory // the reference itself changes - allocate memory for 6 instances A = new Integer[6]; // 3. Allocate memory for each instance separately for (int i = 0; i < A.Length; i++) { A[i] = new Integer(); } // 4. Fill the array with random integers within [0; 10] for (int i = 0; i < A.Length; i++) { // All variables in the array will be displayed outside this function. A[i].value = rnd_num.Next(0, 10); } // 5. Return from function return; } // A static function that calculates the sum of the items of array, // array is passed by reference (with ref modifier) static int SumIntegers(ref Integer[] A) { int sum = 0; for (int i=0; i<A.Length; i++) { sum += A[i].value; } return sum; } static void Main(string[] args) { // Passing a ref-array of class instances to a method // 1. Declare the array of type Integer const int MAX_ITEMS = 8; // maximum number of items in the array Integer[] Array; // 2. Allocate memory for MAX_ITEMS items Array = new Integer[MAX_ITEMS]; // 3. Allocate memory for each item of type Integer for (int i = 0; i < Array.Length; i++) Array[i] = new Integer(); // 4. Fill Array with values from 1 to Array.Length for (int i=0; i<Array.Length; i++) { Array[i].value = i + 1; } // 5. Print the array to a string on the screen Console.WriteLine("Items in Array:"); for (int i=0; i<Array.Length; i++) { Console.Write($"{Array[i].value}\t"); } // 6. Fill Array with random numbers // by calling the GetArray() function GetArray(ref Array); // static function, modifies the array internally // 7. Display the changed array on the screen Console.WriteLine("\nArray after random forming:"); for (int i=0; i<Array.Length; i++) { Console.Write($"{Array[i].value}\t"); } // 8. Calculate the sum of the items of the changed array and display it on the screen int summ = Program.SumIntegers(ref Array); Console.WriteLine($"\nsumm = {summ}"); } } }
The result of the program:
Items in Array: 1 2 3 4 5 6 7 8 Array after random forming: 4 3 8 9 7 7 summ = 38
⇑
3. Passing a one-dimensional array of class instances as an out-parameter. Example
This example is very close to the example in paragraph 2 (passing an array as a ref parameter). The only difference is in the GetArray() function, in which the ref modifier is replaced with the out modifier.
using System; namespace ConsoleApp2 { // Class Integer - reference type class Integer { public int value; } class Program { // The static function GetArray() generates forms an array of random numbers, // array is passed as out-parameter, you can change the reference A itself static void GetArrayOut(out Integer[] A) { // 1. Initialize random number generator Random rnd_num = new Random(); // 2. Change the number of items in array A A = new Integer[6]; // the reference itself changes - allocate memory for 6 instances // 3. Allocate memory for each instance separately for (int i = 0; i < A.Length; i++) { A[i] = new Integer(); } // 4. Fill the array with random integers within [0; 10] for (int i = 0; i < A.Length; i++) { // All changes in the array will be displayed outside this function. A[i].value = rnd_num.Next(0, 10); } // 5. Return from function return; } // A static function that calculated the sum of the items of the array, // array is passed by reference (with the ref modifier) static int SumIntegers(ref Integer[] A) { int sum = 0; for (int i=0; i<A.Length; i++) { sum += A[i].value; } return sum; } static void Main(string[] args) { // Passing an out-array of class instances to a method // 1. Declare an array of type Integer const int MAX_ITEMS = 8; // maximum number of items in the array Integer[] Array; // 2. Allocate memory for MAX_ITEMS items Array = new Integer[MAX_ITEMS]; // 3. Allocate memory for each item of type Integer for (int i = 0; i < Array.Length; i++) Array[i] = new Integer(); // 4. Fill Array with fixed values from 1 to MAX_ITEMS for (int i=0; i<Array.Length; i++) { Array[i].value = i + 1; } // 5. Print the array to screen Console.WriteLine("Items in Array:"); for (int i=0; i<Array.Length; i++) { Console.Write($"{Array[i].value}\t"); } // 6. Fill Array with random numbers // by calling the GetArray() function GetArrayOut(out Array); // static function, modifies the array internally // 7. Display the changed array on the screen Console.WriteLine("\nArray after random forming:"); for (int i=0; i<Array.Length; i++) { Console.Write($"{Array[i].value}\t"); } // 8. Calculate the sum of the items of the changed array and display it on the screen int summ = Program.SumIntegers(ref Array); Console.WriteLine($"\nsumm = {summ}"); } } }
The result of the program:
Items in Array: 1 2 3 4 5 6 7 8 Array after random forming: 1 4 5 9 5 2 summ = 26
⇑
4. Passing a two-dimensional array of class instances as a ref-parameter. Example
The example demonstrates passing a two-dimensional array of class instances as a ref-parameter to a function. If it is necessary to implement the passing a two-dimensional array to the function as an out-parameter, then the ref modifier is replaced by the out modifier.
The program implements the following classes and methods:
- class Integer – implements an integer;
- the static method GetArray2D(), which receives the parameters a reference to a two-dimensional array A of instances of the class Integer and a reference to the variables Rows, Columns (number of rows and number of columns). In this method, memory is allocated for the array, the sizes and value of its elements are formed. All changes inside the function will be displayed in the calling code (main() function);
- static method SumIntegers2D(), which receives as parameters ref-reference to the array and its dimension. The method calculates the sum of the items of the array;
- static method PrintArray2D(), which receives the array and its dimension by value (without ref or out modifiers). This method displays the array on the screen.
The program code is as follows
using System; namespace ConsoleApp2 { // Class Integer - reference type class Integer { public int value; } class Program { // The static function GetArray2D() generates an array of random numbers. // The array is passed as a ref parameter, you can change the reference A. // Parameters Rows, Columns return the number of columns and rows of the array. static void GetArray2D(ref Integer[,] A, ref int Rows, ref int Columns) { // 1. Initialize random number generator Random rnd_num = new Random(); // 2. Form the size of array Rows = 3; Columns = 4; // 3. Allocate memory for a two-dimensional array A = new Integer[Rows, Columns]; // 4. Allocate memory for each instance separately for (int i = 0; i < Rows; i++) for (int j = 0; j < Columns; j++) { A[i, j] = new Integer(); } // 5. Fill the array with random integers within [0; 10] for (int i = 0; i < Rows; i++) for (int j = 0; j < Columns; j++) { // All changes in the array will be displayed outside this function. A[i, j].value = rnd_num.Next(0, 10); } // 6. Return from function return; } // A static function that calculates the sum of the items of a two-dimensional array. // The array is passed by reference (with the ref modifier). // Parameters Rows, Columns are passed by value. static int SumIntegers2D(ref Integer[,] A, int Rows, int Columns) { int sum = 0; for (int i = 0; i < Rows; i++) for (int j = 0; j < Columns; j++) { sum += A[i, j].value; } return sum; } // The static function PringArray2D (), which displays a two-dimensional array on the screen. // The function receives an array A, the sizes of the array m, n. // Parameters are passed by value static void PrintArray2D(Integer[,] A, int m, int n) { for (int i = 0; i < m; i++) { for (int j = 0; j < n; j++) { Console.Write("{0}\t", A[i, j].value); } Console.WriteLine(); } } static void Main(string[] args) { // Passing a two-dimensional ref array of class instances to a method // 1. Declare a reference to a two-dimensional array of type Integer Integer[,] Array2D = null; // 2. Set the number of rows and columns in the array int m, n; m = 2; n = 3; // 3. Form the array using the GetArray2D() function GetArray2D(ref Array2D, ref m, ref n); // 4. Display the generated array on the screen Console.WriteLine("Array2D:"); PrintArray2D(Array2D, m, n); // 5. Calculate the sum of the items of the array and display it on the screen. int summ = SumIntegers2D(ref Array2D, m, n); Console.WriteLine($"summ = {summ}"); } } }
The result of the program
Array2D: 5 1 7 6 7 7 8 9 7 2 3 7 summ = 69
⇑
Related topics
⇑