Прошел курс. Получил код Dreamspark. Ввожу код на сайте, пишет: Срок действия этого кода проверки уже истек. Проверьте, правильно ли введен код. У вас осталось две попытки. Вы также можете выбрать другой способ проверки или предоставить соответствующие документы, подтверждающие ваш академический статус.
Как активировать код? |
Основы языка C#. Часть 2
Модификаторы параметров методов
В языке C# существуют два типа переменных - типы, характеризуемые значением и ссылочные типы. Переменные типа значения содержат именованные данные, к которым относятся все числовые типы, структуры и перечисления. Они создаются при компиляции программы и размещаются в стековой области памяти при их загрузке. Ссылочные типы содержат адреса участков памяти, создаваемых динамически при выполнении программы, и представляют неименованные данные.
Объявление типа | Создание объекта | Альтернативный синтаксис создания объекта |
---|---|---|
Встроенный тип, характеризуемый значением | int a; | int a = new int(); |
Пользовательский тип, характеризуемый значением struct MyStruct { public x, y; } | MyStruct point; | MyStruct point = new MyStruct(); |
Пользовательский тип, характеризуемый ссылкойstruct MyClass { public x, y; } |
// Объявили ссылку MyClass point; // Создали и привязали объект point = new MyClass(); |
MyClass point = new MyClass(); |
На случай применения одинакового синтаксиса конструктор по умолчанию без параметров за типами значений зарезервирован и его переопределять нельзя. Можно только дополнить тип параметризованными конструкторами.
При выполнении операции присваивания в переменные типа значений копируются сами данные, в переменные типа ссылок копируется адрес расположения одних и тех же данных.
В C# формальные параметры метода при его объявлении называют просто параметрами, а фактические параметры, передаваемые методу при его вызове - аргументами. Статические методы и методы экземпляра могут использовать параметры, передаваемые как аргументы вызывающей стороной (клиентами класса). В C# предлагается множество модификаторов параметров, которые обеспечивают контроль со стороны компилятора за действиями программиста при вызове этих методов и передаче им фактических аргументов.
Модификатор | Описание |
---|---|
(нет) | Если параметр метода не помечен модификатором, то предполагается передача параметра по значению, т.е. в вызываемый метод передается копия оригинальных данных |
out | Выходной параметр устанавливается вызываемым методом и передается по ссылке. Если вызываемый метод не присвоит выходному параметру значение, то генерируется ошибка компиляции |
params | Позволяет переслать произвольное число аргументов одинакового типа в виде единого параметра. Для любого метода допускается только один модификатор params и только для последнего по порядку следования параметра |
ref | Передается ссылка на данные клиента, которые метод может менять внутри себя. Фактически метод работает с данными, размещенными вне его |
Внутренние ( private ) методы класса обычно параметров не имеют, поскольку все объявленные в классе поля видимы внутри методов класса. Параметры нужны для общедоступных ( public ) методов, с которыми общаются клиенты класса и передают через них новые значения данных. Такие методы называются интерфейсными, включая и конструкторы.
Входные параметры, представленные значением
При передаче именованного параметра он передается по значению, т.е. внутри метода создается копия подключенных данных и метод работает с этой копией. Оригинальные данные клиента метода не меняются и вызывающая сторона не увидит выполненных изменений. Это самый безопасный способ передачи, когда по исходным данным нужно получить какой-то результат, оставив сами данные без изменений.
Приведем простой пример.
using System; static class Calculator { public static int Add(int x, int y, int a, int b) { int answer = x + y; x = 10; y = 20; a = 30; b = 40; return answer; } } class Start { static void Main()// Вызывающая сторона { // Настройка консоли Console.Title = "Передача параметров по значению"; Console.ForegroundColor = ConsoleColor.White; Console.CursorVisible = false; int x = 1, y = 2, a = 3, b = 4; Console.WriteLine("До вызова: \tx={0}; y={1}; a={2}; b={3}", x, y, a, b); Calculator.Add(x, y, a, b); Console.WriteLine("После вызова: \tx={0}; y={1}; a={2}; b={3}", x, y, a, b); Console.ReadLine(); } }Листинг 8.1 . Передача параметров по значению
Результат будет таким
Мы видим, что переприсваивание значений параметрам внутри метода не влияет на изменения данных, хранящихся в вызывающей стороне, поскольку метод работает с копиями.
Следует отметить, что когда методу передается ссылка на объект, то метод всегда работает с внешними данными, то есть с самим объектом.
Выходные параметры, представленные значением
Часть параметров, которым планируется внутри метода выполнить изменения значений, следует обозначать как выходные с помощью ключевого слова out. Это требуется делать и в объявлении метода, и в его вызове.
Пометим в предыдущем примере два параметра как выходные. Код будет таким
using System; static class Calculator { public static int Add(int x, int y, out int a, out int b) { int answer = x + y; x = 10; y = 20; a = 30; b = 40; return answer; } } class Start { static void Main()// Вызывающая сторона { // Настройка консоли Console.Title = "Применение выходных параметров"; Console.ForegroundColor = ConsoleColor.White; Console.CursorVisible = false; int x = 1, y = 2, a = 3, b = 4; Console.WriteLine("До вызова: \tx={0}; y={1}; a={2}; b={3}", x, y, a, b); Calculator.Add(x, y, out a, out b); Console.WriteLine("После вызова: \tx={0}; y={1}; a={2}; b={3}", x, y, a, b); Console.ReadLine(); } }Листинг 8.2 . Применение выходных параметров
Выполним пример
Мы видим, что отмеченные как выходные параметры меняют в вызывающем коде свои значения. Им в клиенте не обязательно присваивать значения, все равно метод их изменит.