Что такое out в c
Перейти к содержимому

Что такое out в c

  • автор:

out (Справочник по C#)

Ключевое слово out можно использовать в двух контекстах:

  • В качестве модификатора параметра, который позволяет передавать аргумент в метод по ссылке, а не по значению.
  • В объявлениях параметров универсального типа для интерфейсов и делегатов, что указывает, что параметр типа является ковариантным.

См. также

Совместная работа с нами на GitHub

Источник этого содержимого можно найти на GitHub, где также можно создавать и просматривать проблемы и запросы на вытягивание. Дополнительные сведения см. в нашем руководстве для участников.

Модификаторы методов Out и другие в C#

Модификаторы методов Out и другие в C#

Для выполнения различных операций в программировании используются разнообразные ключевые слова, аргументы, функции и параметры. Каждый разработчик, работающий с C Sharp, должен быть знаком с out и ref. Они помогают передавать аргументы внутри методов или разнообразных алгоритмов. Знать соответствующие компоненты должен каждый программист.

Далее предстоит получше познакомиться с in out в C Sharp. Также необходимо разобраться, для чего используется ref, что он означает и чем отличается от «аута». Предложенные сведения больше ориентированы на новичков, которые уже имеют поверхностные знания о том, как составляются программные продукты.

Способы передачи аргументов

Источники Google указывает на то, что параметры в методы и функции могут быть переданы несколькими способами:

  • по значениям;
  • при помощи ссылок.

Наиболее простой вариант – первый. Это «обычный» способ передачи методу тех или иных значений. При работе со ссылками предстоит иметь дело с ref и out, поэтому каждую концепцию необходимо рассмотреть более детально.

Передача по значениям

В Google полно полезной информации о том, как передавать значение переменной в том или ином языке программирования. Первый и элементарный подход – это прямое «присваивание» параметров в методе:

Модификаторы методов Out и другие в C#

В консоли появится такая запись:

Модификаторы методов Out и другие в C#

Поисковая система Google указывает на то, что при передаче аргументов методу по значению параметр этого самого метода получает не непосредственную переменную, а ее копию. Именно с ней будет производиться дальнейшая работа. Соответствующий прием помогает добиться реальной независимости от самой переменной.

В приведенном выше примере при обращении к вызову метода Increment будет получена копия переменной number. Также произойдет увеличение значения соответствующей копии. В самом методе Increment показано, что значение параметра n увеличивается на 1, но после выполнения команды переменная number обладает прежним значением – 5. Все это объясняет принцип работы концепции: меняться будет копия, а не непосредственная имеющаяся переменная. Соответствующая информация поможет понять ключевые отличия передачи аргументов по ссылкам.

Передача по ссылкам – ref

В C Sharp аргументы могут передаваться по ссылкам. Для этого используются специальные модификаторы. В качестве них указывается ключевое слово ref, а также out. Далее каждый компонент будет изучен более детально. Это необходимо, чтобы понимать, в чем различие модификаторов.

Первый вариант – ref. Этот модификатор значит, что передача аргументов производится по ссылке перед параметрами. Пример кода:

Результат обработки предложенного выше фрагмента:

Модификаторы методов Out и другие в C#

Поиск в Google указывает на то, что модификатор ref используется для передачи аргументов по ссылке. Метод в этом случае получит адрес переменной в памяти. Если в нем изменяется значение заданного параметра, сама переменная тоже будет изменена.

Если изучать описание предложенного выше фрагмента, то источники из Google подскажут, что в метод Increment будет передана ссылка на number в памяти. Если n в Increment изменится, это приведет к тому, что поменяется и number. Подобный результат достигается за счет того, что аргумент n и переменная number указывают на один и тот же адрес в памяти.

Стоит обратить внимание на то, что модификатор in ref указывается как перед параметром при объявлении метода, так и непосредственно при вызове метода перед значением, которое передается параметру.

Общая синтаксическая форма

Официальная документация и специализированные сайты из Google помогут разобраться в том, как программистам использовать в коде различные опции и функции, что означает каждая из них, а также в чем заключается разница. Это касается не только сложных алгоритмов, но и способов передачи параметров в методы.

Рассматривая модификаторы ref и in out, нужно не только знать, что означает каждая запись, но и какую форму представления она имеет. Для ref источники Google предлагают пользоваться следующим синтаксисом:

Модификаторы методов Out и другие в C#

  • access – тип доступа к методу (он может быть internal, public, protected и private);
  • MethodName – непосредственное имя метода;
  • type – тип параметра, обладающий именем param, который будет получать метод;
  • return type – тип, который будет возвращаться при обработке алгоритма;
  • param – имя формального параметра.

Если такой method будет инициализирован и вызван из другого кода, перед параметром будет тоже ставиться модификатор ref:

Модификаторы методов Out и другие в C#

Система Google указывает на то, что argument в предложенной форме записи – значение, передаваемое непосредственно в функцию. Он нужен из-за требований, действующих в C#.

Работа со ссылками – модификатор out

Рассматривая ref и out, их отличия и то, что обозначает каждая соответствующая запись, нельзя обойти вниманием выходные значения. Аргументы могут быть не только входными, но и выходными.

Чтобы сделать тот или иной аргумент принадлежащим к соответствующему типу, нужно указать перед ним модификатор in out (double, int, void или любой другой тип информации):

Тут, согласно Google-источникам, результат будет возвращен не посредством return, а при помощи выходной аргумент result. В программе соответствующий прием может быть использован так:

void Sum(int x, int y, out int result) < result = x + y; >int number; Sum(10, 15, out number); Console.WriteLine(number); // 25

Как и в случае с ref, in out используется не только при определении метода, но и при его непосредственном вызове. Соответствующие сведения указаны в Google и официальной документации C#.

Синтаксическая форма

Модификатор out (с integer, double, static void main и иными типами данных) используется, когда нужно обеспечить выполнение сразу двух условий:

  • методу не требуется передавать значения;
  • метод должен возвращать в обязательном порядке аргумент через параметр.

Существует общая форма представления out. Она поможет понять, в чем заключаются отличия рассматриваемых модификаторов:

Модификаторы методов Out и другие в C#

  • access – вид доступа к методу;
  • return_type – возвращаемый тип (может быть int I, double и не только);
  • type – тип аргумента с именем param, который получит рассматриваемый метод;
  • MethodName – имя метода;
  • param – имя формального параметра.

Также C Sharp допускает использование сокращенной формы записи out:

Модификаторы методов Out и другие в C#

Здесь можно увидеть наглядные примеры рассмотренных модификаторов, а лучше разобраться с ними помогут специализированные компьютерные курсы.

ref и out в C#

ref и out в C#

Всем доброго времени суток, на связи Алексей Гулынин. В прошлой статье мы узнали про перегруженные методы в C#. В данной статье я бы хотел поговорить про ключевые слова ref и out в C#. Использование этих ключевых слов приводит к тому, что параметр начинает передаваться не по значению, а по ссылке. Ключевое слово out обозначает почти то же самое, что и ref . Параметр, перед которым указываются данные операторы, тоже передаётся по ссылке, т.е. в переменной хранится адрес этого параметра. В чем разница же между ref и out ? Разница в том, что out позволяет вам передать ссылку на переменную неинициализированную, а ref — только на инициализированную.

Давайте на примере разберем, что это значит. Создадим метод, который будет принимать числовой параметр. В данном методе этот параметр будем увеличивать и выводить значение. В методе Main() создадим параметр с этим же именем и будем также выводить его значение:

static void Main(string[] args) < int param = 10; testMethod(param); //Выйдет значение = 11 Console.WriteLine("Значение переменной param в методе Main = ", param); //Выйдет значение = 10 Console.ReadLine(); > static void testMethod(int param) < param++; Console.WriteLine("Значение переменной param в методе testMethod = ", param); >

Во втором случае вышло 10, потому что int — это ValueType (это когда параметр передаётся по значению), это значит, что при выполнении команды testMethod(param) метод testMethod() будет работать с копией переменной param (в данный момент происходит копирование переменной в стеке), что никак не повлияет на переменную param, которая была объявлена в методе Main(). Модифицируем наш код, добавив оператор ref перед переменной в методе testMethod(). Обратите внимание, что при вызове данного метода нужно также ставить оператор ref :

static void Main(string[] args) < int param = 10; testMethod(ref param); //Выйдет значение = 11 Console.WriteLine("Значение переменной param в методе Main = ", param); //Выйдет значение = 11 Console.ReadLine(); > static void testMethod(ref int param) < param++; Console.WriteLine("Значение переменной param в методе testMethod = ", param); >

Теперь программа в обоих случаях выводит 11. Тут дело в том, что мы в стек (это область памяти в пространстве адресов) загоняем ссылку на область памяти, где находится переменная param , и в методе testMethod() мы уже работаем не с копией, а с тем же самым параметром param , что и в методе Main() . Те изменения, которые мы провели с переменной param в методе testMethod() будут видны и снаружи (за областью видимости метода).

Внесем изменения в наш код. Просто объявим переменную param , но не будем её инициализировать, т.е. вместо строки int param = 10; запишем int param; . Компилятор старается контролировать использование неинициализированных переменных вы даст ошибку в этом случае. Мы пытаемся переменную, которая не содержит никаких значений, передать в метод и там с ней выполнять определенные действия, но так делать нельзя. А что делать если инициализация переменной выполняется как раз в этом методе?

В этом случае как раз и используют out :

static void Main(string[] args) < int param; testMethod(out param); //Выйдет значение = 11 Console.WriteLine("Значение переменной param в методе Main = ", param); //Выйдет значение = 11 Console.ReadLine(); > static void testMethod(out int param) < param = 10; param++; Console.WriteLine("Значение переменной param в методе testMethod = ", param); >

Теперь в методе testMethod() обязательно нужно проинициализировать переменную param.

В данной небольшой статье вы узнали про ключевые слова ref и out в C#.

На связи был Алексей Гулынин, оставляйте свои комментарии, увидимся в следующих статьях.

Инструкция OUT

В Контакте Ютуб Почта

Команда OUT в Ассемблере выполняет вывод данных в порт. Синтаксис:

OUT ПРИЁМНИК, ИСТОЧНИК

После выполнения этой команды флаги не изменяются.

Инструкция OUT выводит данные из регистра AL или AX (ИСТОЧНИК) в порт ввода-вывода. Номер порта должен быть указан в ПРИЁМНИКЕ.

ПРИЁМНИК может быть указан как непосредственное значение (константа), если номер порта укладывается в байт (не более 255). Если номер порта более 255, то он должен быть предварительно помещён в регистр DX, и тогда этот регистр должен быть указан в качестве ПРИЁМНИКА.

С помощью команды OUT выполняется вывод на все стандартные устройства ввода-вывода, такие как клавиатура, последовательные и параллельные порты, жёсткий диск и другие накопители.

Также можно использовать эту команду для прямой записи в видеопамять. Кроме того, через порты выполняется управление почти всем железом: таймером, динамиком и т.п.

Как вывести данные в порт

Вывод данных в порт в Ассемблере — это довольно распространённое действие. Через порты выполняется обмен данными с внешними и внутренними устройствами компьютера. В качестве примера рассмотрим программу, которая включает динамик компьютера (спикер) на некоторое время.

;Эта программа воспроизводит звук ;через динамик компьютера ;61h - адрес порта динамика ;42h - адрес порта таймера .model tiny .code ORG 100h start: IN AL, 61h ;Получить состояние динамика PUSH AX ;и сохранить его OR AL, 00000011b ;Установить два младших бита OUT 61h, AL ;Включить динамик MOV AL, 10 ;Высота звука (частота) OUT 42h, AL ;Включить таймер, который ;будет выдавать импульсы на ;динамик с заданной частотой MOV CX, Delay ;Установить длительность звука ;Цикл, который определяет продолжительность звучания ;Поскольку одного цикла для задержки будет недостаточно ;(пробежит очень быстро и динамик просто не успеет включиться) ;используется вложенный цикл Zvuk: PUSH CX MOV CX, Delay Cicle: LOOP Cicle POP CX LOOP Zvuk POP AX ;Получить исходное состояние AND AL, 11111100b ;Сбросить два младших бита OUT 61h, AL ;Выключить динамик RET Delay DW 3000 ;Длительность звука END start

Комментарии довольно подробные, поэтому пояснять особо больше нечего. Обратите внимание на цикл — он содержит вложенный цикл. Дело в том, что современные процессоры очень быстрые, и если использовать один цикл, то звук включится и выключится настолько быстро, что вы не успеете ничего услышать (а, как вы догадались, эти циклы используются для выполнения задержки времени, в течение которого динамик включен).

Более подробно работу с таймером, динамиком и т.п. здесь рассматривать не буду, так как статья посвящена не этому, а инструкции OUT. Если будет время и возможность, то сделаю это в другой раз.

Напоследок, как всегда, о происхождении названия OUT. Здесь всё просто — в этот раз никаких сокращений. Слово OUT переводится как ВОН, ПРОЧЬ, НАРУЖУ, ВОВНЕ. То есть с помощью этой команды выполняется ВЫВОД данных в порт, который связан обычно с внешним устройством.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *