- •Обзор элементов класса.
- •Класс Object
- •Структуры
- •Методы Ссылочные параметры ref и out
- •Переменное число аргументов метода
- •Перегрузка методов. Вызов методов с одинаковым именем и разными аргументами
- •Конструкторы экземпляра
- •Вызов конструктора экземпляра
- •Закрытые конструкторы экземпляра
- •Статические конструкторы
- •Конструкторы структур
- •Член со спецификатором readonly
- •Деструкторы. Сборка мусора
- •Объект Account
- •Объект Account недоступен
- •Свойства
- •Индексаторы
- •Предпосылки появления наследования
- •Синтаксис наследования.
- •Типы наследования
- •Множественное наследование
- •Наследование интерфейса
- •Виртуальные методы
- •Спецификаторы доступности
- •Вызов базовых версий функций
- •Абстрактные классы и функции
- •Структуры и наследование
- •Полиморфизм
- •Потеря и восстановление информации о типе
- •Операции is и as
- •Файловый ввод-вывод
- •Потоки данных и файловый ввод-вывод
- •Виды файлов
- •Классы файлового ввода-вывода
- •Класс FileInfo
- •Текстовый ввод-вывод при помощи Stream Reader и Stream Writer
- •Бинарный ввод и вывод при помощи класса FileStream
Методы Ссылочные параметры ref и out
Типы С# можно разделить на типы-значения и ссылочные типы. Когда методу передается значение ссылочного типа, все изменения в пределах метода отражаются и на исходной переменной. Если же аргументом метода является переменная типа-значения, она копируется в формальный параметр. В результате исходная переменная и переменная в методе являются разными, никак не связанными величинами.
До сих пор подобные свойства редко использовались, поскольку любое вычисленное методом значение возвращалось в точку вызова. Но как быть, если требуется возвращать несколько значений? Здесь уже нельзя воспользоваться возвращаемым значением (поскольку так можно возвратить только одну переменную). Дня решения этой проблемы предназначены ссылочные параметры, которые объявляются с ключевым словом ref
public static void Swap(ref int a, ref int b)
Данный заголовок метода указывает, что а и b являются ссылочными параметрами. Вызов метода также должен содержать ключевое слово ref, например:
Swap(ref Value_1, ref Value_2)
Несоблюдение этого правила вызывает сообщение об ошибке на этапе компиляции.
Напишем метод, который обменивает значениями переменные Value_1 и Value_2 и выводит результат.
using System;
class Swapper
{
public static void Main()
{
int value_1=10;
int value_2=20;
Console.WriteLine("Число №1:{0} Число №2:{1}", value_1, value_2);
Swap(ref value_1, ref value_2);
Console.WriteLine("Число №1:{0} Число №2:{1}", value_1, value_2);
Console.ReadLine();
}
public static void Swap(ref int a, ref int b)
{
int c;
c=a;
a=b;
b=c;
}
}
OUT
Любой аргумент, передаваемый как ссылочный параметр, должен поддерживать присваивание значения (т.е. он не может быть, к примеру, Константой). Swap(ref 10, ref 20) так как числу 10 или 20 нельзя присвоить значение.
До данного момента требовалось, чтобы любая переменная, используемая как аргумент метода, в начале инициализировалась. Например, рассмотрим следующий фрагмент кода:
using System;
class c
{
public static void Main()
{
int a;
m(a);
Console.WriteLine(a);
Console.ReadLine();
}
public static void m(int new_value)
{
new_value=100;
}
}
При попытке компиляции будет выдано сообщение об ошибке.
В некоторых случаях требуется функциональность которой обладает ссылочный параметр, но с возможностью использования неинициализированных переменных. Для этого предусмотрена концепция выходного параметра, который обозначается ключевым словом out.
Использование данного ключевого слова демонстрируется в с следующей программе:
using System;
class c
{
public static void Main()
{
int a;
m(out a);
Console.WriteLine(a);
Console.ReadLine();
}
public static void m( out int new_value)
{
new_value=100;
}
}
Переменное число аргументов метода
public static int Sum(int a, int b)
{
int sumTotal;
sumTotal = a + b;
return sumTotal;
}
Метод Sum вычисляет сумму лишь двух аргументов. Предположим, что требуется подсчитать сумму трех, четырех и десяти аргументов. Можно попытаться создать соответствующие методы, заголовки которых выглядят следующим образом:
При создании новых методов с другим количеством входных параметров код программы резко увеличивается и становиться громоздким. Его можно упростить, создан метод, воспринимающий любое число аргументов. Именно для этого и предназначен массив параметров. Он объявляется посредством ключевого слова params перед одномерным массивом в заголовке метода
public static Int Sum(params int [] numbers)
Теперь вызов метода Sum может включать любое число аргументов.
Массив параметров должен быть одномерным, поэтому с ключевым словом params нельзя использовать массивы формата int [ , ].
Ключевое слово params указывает среде исполнения автоматически вставлять аргументы в массив numbers. Если вызов метода Sum выглядит, например, ...Sum(10,20,30)
Mассив numbers будет иметь длину 3 и к моменту вызова метода Sum содержать следующее:
Индекс 0 1 2
Значение 10 20 30
Массив numbers принадлежит типу int, поэтому тип всех предполагаемых аргументов должен быть неявно преобразуем в int.
Метода Sum может вообще не содержать аргументов. Это говорит о том, что массив numbers имеет нулевую длину.
Наконец, аргументом метода Sum может быть и одномерный массив, базовый тип которого неявно преобразуется в тип массива numbers.
using System;
class SumCalculator
{
public static void Main()
{
int res1, res2, res3, res4;
int [] n={4,5,6,7};
res1=Sum(1,2);
res2=Sum(1,2,3);
res3=Sum(n);
res4=Sum();
Console.WriteLine("\n\nСумма: {0}, {1}, {2}, {3}",res1,res2,res3,res4);
Console.ReadLine();
}
public static int Sum(params int[] nombers)
{
int Sum=0;
Console.WriteLine("\nКоличество слагаемых{0}",nombers.Length);
for (int i=0; i<nombers.Length; i++)
{
Sum+=nombers[i];
Console.WriteLine("Слагаемое №{0}= {1}",i+1,nombers[i]);
}
return Sum;
}