- Double – 64-разрядная переменная с плавающей запятой
- Применение DOUBLE
- DOUBLE, FLOAT И INT
- Модификатор ref
- Модификатор out
- Модификатор params
- Объявление параметров out Declaring out parameters
- Вызов метода с аргументом out Calling a method with an out argument
- Спецификация языка C# C# Language Specification
Double – 64-разрядная переменная с плавающей запятой
Тип double — это основной тип данных, который используется для переменных, содержащих числа с дробной частью. Double используется в C , C++ , C# и других языках программирования. Он может представлять как дробные, так и целые значения длинной до 15 знаков.
Применение DOUBLE
Тип float раньше использовался из-за того, что он был меньше double и позволял быстрее работать с тысячами и миллионами чисел с плавающей запятой. Но вычислительная мощность новых процессоров выросла настолько, что преимуществами float перед double можно пренебречь. Многие программисты считают double типом по умолчанию для чисел с плавающей запятой.
DOUBLE, FLOAT И INT
Другие числовые типы данных — это float и int . Типы данных double и float похожи, но отличаются точностью и диапазоном:
- Float — 32-битный тип, вмещающий семь цифр. Его диапазон — примерно от 1.5 х 215; 10 -45 до 3.4 х 10 38 ;
- Double — 64-битный тип, вмещающий 15 или 16 цифр с диапазоном от 5.0 х 10 345 to 1.7 х 10 308 .
Int также относится к числовым типам данных, но с ним можно использовать только целые числа, которым не нужна запятая. Таким образом, int содержит только целые числа, но при этом занимает меньше места. Он позволяет быстрее совершать математические операции, а также эффективнее других типов данных использует кэш-память и пропускную способность соединения.
Данная публикация представляет собой перевод статьи « Definition of Double in C, C++ and C# » , подготовленной дружной командой проекта Интернет-технологии.ру
Mетоды могут как принимать, так и не принимать параметров, а также возвращать или не возвращать значения вызывающей стороне. Хотя определение метода в C# выглядит довольно понятно, существует несколько ключевых слов, с помощью которых можно управлять способом передачи аргументов интересующему методу:
Модификатор параметра | Описание |
---|---|
(отсутствует) | Если параметр не сопровождается модификатором, предполагается, что он должен передаваться по значению, т.е. вызываемый метод должен получать копию исходных данных |
out | Выходные параметры должны присваиваться вызываемым методом (и, следовательно, передаваться по ссылке). Если параметрам out в вызываемом методе значения не присвоены, компилятор сообщит об ошибке |
ref | Это значение первоначально присваивается вызывающим кодом и при желании может повторно присваиваться в вызываемом методе (поскольку данные также передаются по ссылке). Если параметрам ref в вызываемом методе значения не присвоены, компилятор никакой ошибки генерировать не будет |
params | Этот модификатор позволяет передавать в виде одного логического параметра переменное количество аргументов. В каждом методе может присутствовать только один модификатор params и он должен обязательно указываться последним в списке параметров. В реальности необходимость в использовании модификатора params возникает не особо часто, однако он применяется во многих методах внутри библиотек базовых классов |
Нередко требуется, чтобы метод оперировал теми аргументами, которые ему передаются. Характерным тому примером служит метод Swap(), осуществляющий перестановку значений своих аргументов. Но поскольку аргументы простых типов передаются по значению, то, используя выбираемый в C# по умолчанию механизм вызова по значению для передачи аргумента параметру, невозможно написать метод, меняющий местами значения двух его аргументов, например типа int. Это затруднение разрешает модификатор ref.
Как вам должно быть уже известно, значение возвращается из метода вызывающей части программы с помощью оператора return. Но метод может одновременно возвратить лишь одно значение. А что, если из метода требуется возвратить два или более фрагментов информации, например, целую и дробную части числового значения с плавающей точкой? Такой метод можно написать, используя модификатор out.
Давайте отдельно рассмотрим роль каждого из вышеуказанных ключевых слов.
Модификатор ref
Модификатор параметра ref принудительно организует вызов по ссылке, а не по значению. Этот модификатор указывается как при объявлении, так и при вызове метода.
Параметры, сопровождаемые таким модификатором, называются ссылочными и применяются, когда нужно позволить методу выполнять операции и обычно также изменять значения различных элементов данных, объявляемых в вызывающем коде (например, в процедуре сортировки или обмена). Обратите внимание на следующие отличия между ссылочными и выходными параметрами:
Выходные параметры
Это параметры, которые не нужно инициализировать перед передачей методу. Причина в том, что метод сам должен присваивать значения выходным параметрам перед выходом.
Ссылочные параметры
Эти параметры нужно обязательно инициализировать перед передачей методу. Причина в том, что они подразумевают передачу ссылки на уже существующую переменную. Если первоначальное значение ей не присвоено, это будет равнозначно выполнению операции над неинициализированной локальной переменной.
Давайте рассмотрим пример использования модификатора ref:
В отношении модификатора ref необходимо иметь в виду следующее. Аргументу, передаваемому по ссылке с помощью этого модификатора, должно быть присвоено значение до вызова метода. Дело в том, что в методе, получающем такой аргумент в качестве параметра, предполагается, что параметр ссылается на действительное значение. Следовательно, при использовании модификатора ref в методе нельзя задать первоначальное значение аргумента.
Модификатор out
Модификатор параметра out подобен модификатору ref, за одним исключением: он служит только для передачи значения за пределы метода. Поэтому переменной, используемой в качестве параметра out, не нужно (да и бесполезно) присваивать какое-то значение. Более того, в методе параметр out считается неинициализированным, т.е. предполагается, что у него отсутствует первоначальное значение. Это означает, что значение должно быть присвоено данному параметру в методе до его завершения. Следовательно, после вызова метода параметр out будет содержать некоторое значение.
Обратите внимание, что использование модификатора out в данном примере позволяет возвращать из метода сразу четыре значения.
Модификатор params
В C# поддерживается использование массивов параметров за счет применения ключевого слова params. Ключевое слово params позволяет передавать методу переменное количество аргументов одного типа в виде единственного логического параметра. Аргументы, помеченные ключевым словом params, могут обрабатываться, если вызывающий код на их месте передает строго типизированный массив или разделенный запятыми список элементов.
Число элементов массива параметров будет равно числу аргументов, передаваемых методу. А для получения аргументов в программе организуется доступ к данному массиву:
В тех случаях, когда у метода имеются обычные параметры, а также параметр переменной длины типа params, он должен быть указан последним в списке параметров данного метода. Но в любом случае параметр типа params должен быть единственным.
Ключевое out инициирует передачу аргументов по ссылке. The out keyword causes arguments to be passed by reference. В результате этот формальный параметр становится псевдонимом для аргумента, который должен представлять собой переменную. It makes the formal parameter an alias for the argument, which must be a variable. Другими словами, любая операция в параметре осуществляется с аргументом. In other words, any operation on the parameter is made on the argument. Оно схоже с ключевым словом ref за исключением того, что при использовании ref перед передачей переменную необходимо инициализировать. It is like the ref keyword, except that ref requires that the variable be initialized before it is passed. Оно также похоже на ключевое слово in за исключением того, что in не позволяет вызываемому методу изменять значение аргумента. It is also like the in keyword, except that in does not allow the called method to modify the argument value. Для применения параметра out определение метода и метод вызова должны явно использовать ключевое слово out . To use an out parameter, both the method definition and the calling method must explicitly use the out keyword. Пример: For example:
Ключевое слово out также можно использовать с параметром универсального типа для указания на то, что тип параметра является ковариантным. The out keyword can also be used with a generic type parameter to specify that the type parameter is covariant. Дополнительные сведения об использовании ключевого слова out в этом контексте см. в разделе out (универсальный модификатор). For more information on the use of the out keyword in this context, see out (Generic Modifier).
Переменные, передаваемые в качестве аргументов out , не требуется инициализировать перед передачей в вызове метода. Variables passed as out arguments do not have to be initialized before being passed in a method call. Но перед передачей управления из вызванного метода он должен присвоить значение. However, the called method is required to assign a value before the method returns.
Ключевые слова in , ref и out не считаются частью сигнатуры метода для разрешения перегрузки. The in , ref , and out keywords are not considered part of the method signature for the purpose of overload resolution. Таким образом, методы не могут быть перегружены, если единственное различие состоит в том, что один метод принимает аргумент ref или in , а другой — out . Therefore, methods cannot be overloaded if the only difference is that one method takes a ref or in argument and the other takes an out argument. Следующий код, например, компилироваться не будет. The following code, for example, will not compile:
Перегрузка допустима, если один метод принимает аргумент ref , in или out , а другой не использует ни один из этих модификаторов, как показано ниже. Overloading is legal, however, if one method takes a ref , in , or out argument and the other has none of those modifiers, like this:
Компилятор выбирает наиболее подходящую перегрузку, сравнивая модификаторы параметров в месте вызова с модификаторами параметров в вызове метода. The compiler chooses the best overload by matching the parameter modifiers at the call site to the parameter modifiers used in the method call.
Свойства не являются переменными и поэтому не могут быть переданы как параметры out . Properties are not variables and therefore cannot be passed as out parameters.
Ключевые слова in , ref и out запрещено использовать для следующих типов методов. You can’t use the in , ref , and out keywords for the following kinds of methods:
Асинхронные методы, которые определяются с помощью модификатора async. Async methods, which you define by using the async modifier.
Методы итератора, которые включают оператор yield return или yield break . Iterator methods, which include a yield return or yield break statement.
Объявление параметров out Declaring out parameters
Объявление метода с аргументами out — стандартное решение для возвращения нескольких значений. Declaring a method with out arguments is a classic workaround to return multiple values. Начиная с версии C# 7.0, вы можете использовать кортежи для таких сценариев. Beginning with C# 7.0, consider tuples for similar scenarios. В следующем примере используется out для возвращения трех переменных с помощью вызова одного метода. The following example uses out to return three variables with a single method call. Обратите внимание, что третьему аргумент присвоено значение null. Note that the third argument is assigned to null. Это позволяет методам возвращать значения по желанию. This enables methods to return values optionally.
Вызов метода с аргументом out Calling a method with an out argument
В C# 6 и более ранних версиях необходимо было объявлять переменную в отдельном операторе, прежде чем передавать ее как аргумент out . In C# 6 and earlier, you must declare a variable in a separate statement before you pass it as an out argument. В следующем примере переменная number объявляется перед передачей в метод Int32.TryParse, который пытается преобразовать строку в число. The following example declares a variable named number before it is passed to the Int32.TryParse method, which attempts to convert a string to a number.
Начиная с C# версии 7.0 переменную out можно объявлять в списке аргументов вызова метода, а не отдельно. Starting with C# 7.0, you can declare the out variable in the argument list of the method call, rather than in a separate variable declaration. Это делает код более кратким и удобным для восприятия, а также предотвращает непреднамеренное присвоение значения переменной перед вызовом метода. This produces more compact, readable code, and also prevents you from inadvertently assigning a value to the variable before the method call. Следующий пример аналогичен предыдущему за тем исключением, что переменная number объявляется в вызове метода Int32.TryParse. The following example is like the previous example, except that it defines the number variable in the call to the Int32.TryParse method.
В предыдущем примере переменная number строго типизирована как int . In the previous example, the number variable is strongly typed as an int . Вы также можете объявить неявно типизированную локальную переменную, как в приведенном ниже примере. You can also declare an implicitly typed local variable, as the following example does.
Спецификация языка C# C# Language Specification
Дополнительные сведения см. в спецификации языка C#. For more information, see the C# Language Specification. Спецификация языка является предписывающим источником информации о синтаксисе и использовании языка C#. The language specification is the definitive source for C# syntax and usage.