Public void c что это

от admin

Методы

Следует отметить, что официальная терминология C# делает различие между функциями и методами. Согласно этой терминологии, понятие «функция-член» включает не только методы, но также другие члены, не являющиеся данными, класса или структуры. Сюда входят индексаторы, операции, конструкторы, деструкторы, а также — возможно, несколько неожиданно — свойства. Они контрастируют с данными-членами: полями, константами и событиями.

Объявление методов

В C# определение метода состоит из любых модификаторов (таких как спецификация доступности), типа возвращаемого значения, за которым следует имя метода, затем список аргументов в круглых скобках и далее — тело метода в фигурных скобках:

Каждый параметр состоит из имени типа параметра и имени, по которому к нему можно обратиться в теле метода. Вдобавок, если метод возвращает значение, то для указания точки выхода должен использоваться оператор возврата return вместе с возвращаемым значением.

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

Возврат из метода и возврат значения

В целом, возврат из метода может произойти при двух условиях. Во-первых, когда встречается фигурная скобка, закрывающая тело метода. И во-вторых, когда выполняется оператор return. Имеются две формы оператора return: одна — для методов типа void (возврат из метода), т.е. тех методов, которые не возвращают значения, а другая — для методов, возвращающих конкретные значения (возврат значения).

Давайте рассмотрим пример:

Вызов из метода

Использование параметров

При вызове метода ему можно передать одно или несколько значений. Значение, передаваемое методу, называется аргументом. А переменная, получающая аргумент, называется формальным параметром, или просто параметром. Параметры объявляются в скобках после имени метода. Синтаксис объявления параметров такой же, как и у переменных. А областью действия параметров является тело метода. За исключением особых случаев передачи аргументов методу, параметры действуют так же, как и любые другие переменные.

В общем случае параметры могут передаваться методу либо по значению, либо по ссылке. Когда переменная передается по ссылке, вызываемый метод получает саму переменную, поэтому любые изменения, которым она подвергнется внутри метода, останутся в силе после его завершения. Но если переменная передается по значению, вызываемый метод получает копию этой переменной, а это значит, что все изменения в ней по завершении метода будут утеряны. Для сложных типов данных передача по ссылке более эффективна из-за большого объема данных, который приходится копировать при передаче по значению.

Давайте рассмотрим пример:

Передача параметров в методы C#

Обратите внимание, что значение i осталось неизменным, но измененные значения в myArr также изменились в исходном массиве arr1, так как массивы являются ссылочными типами.

Поведение строк также отличается. Дело в том, что строки являются неизменными (изменение значения строки приводит к созданию совершенно новой строки), поэтому строки не демонстрируют поведение, характерное для ссылочных типов. Любые изменения, проведенные в строке внутри метода, не влияют на исходную строку.

C#. Понятие метода. Примеры методов в классах. Возврат из метода. Оператор return. Методы без параметров. Ключевое слово void

Понятие метода. Примеры методов в классах. Возврат из метода. Оператор return . Методы без параметров. Ключевое слово void

Содержание

  • 1. Что такое метод в классе? Определение метода в классе
  • 2. Какие имена запрещается давать методам?
  • 3. Общая форма определения метода в классе
  • 4. Какое назначение имеет оператор return в теле метода?
  • 5. Примеры методов в классах
  • 6. Аргументы и формальные параметры метода
  • 7. Как параметры передаются в метод? Синтаксис описания параметров метода
  • 8. Использование ключевого слова void в параметрах методов
  • 9. Что значит термин «недоступный код» в методе?
  • 10. Пример, демонстрирующий различные способы возврата экземпляра класса из метода

Поиск на других ресурсах:

1. Что такое метод в классе? Определение метода в классе

Метод (функция) – это фрагмент подпрограммы, которая имеет имя. По этому имени можно вызывать подпрограмму (метод) один или несколько раз. Вместо имени будет подставляться тело подпрограммы (метода). Имя метода целесообразно давать таким, чтобы легко можно было распознать его функцию в программе.

Кроме данных (переменных) классы могут содержать и методы. Методы делают над данными некоторые операции (некоторую работу). Во многих случаях методы представляют доступ к данным класса. С помощью методов класса происходит взаимодействие класса с другими частями программы или другими классами.
Методы дополняют класс дополнительными функциональными возможностями. Как правило, каждый метод выполняет одну функцию.

2. Какие имена запрещается давать методам?

Имя метода может быль любым, которое соответствует правилам использования идентификаторов в C#. Однако не все имена можно использовать как имя метода.

В качестве имени метода запрещается задавать:

  • имя Main() . Это имя точки входа в программу на C#, то есть из метода Main() начинается выполнение программы. Это имя зарезервировано;
  • имена ключевых слов C#.

3. Общая форма определения метода в классе

В общем реализация метода в классе имеет следующий вид:

  • MethodName – имя метода, который объявляется. По этому имени можно вызвать метод из класса или программы. При вызове метода обязательно указываются параметры метода, которые он получает;
  • access – модификатор, который определяет доступ к методу из разных частей программы. Модификатор доступа может быть private , protected , public . Модификатор доступа может отсутствовать, в этом случае метод считается закрытым ( private );
  • return_type – тип, возвращаемый методом. Если метод не возвращает значения, указывается тип void ;
  • parameter_list – список параметров, который получает метод. Метод может не иметь параметров. В этом случае в скобках ничего не указывается.

4. Какое назначение имеет оператор return в теле метода?

Оператор return предназначен для возврата значения из метода. Если метод возвращает какое-то значение, то вызов оператора return есть обязательным.
Оператор return имеет две формы. Первая форма используется, когда метод возвращает значение. Вторая форма, когда метод не возвращает значения, то есть возвращает тип void.
Первая форма оператора return имеет следующий вид:

где value – значение, возвращаемое методом. Тип value должен быть совместимым с типом, который возвращает метод.

Вторая форма используется, когда метод не возвращает значения ( void ). В этом случае оператор return имеет вид:

В методе, который не возвращает значения, указывать оператор return не обязательно.

5. Примеры методов в классах

Пример 1. В примере реализуется класс DemoString . В классе объявляется:

  • внутренняя переменная s типа string , которая есть строкой;
  • конструктор класса без параметров. Инициализирует строку s пустым значением;
  • конструктор класса с параметром, который инициализирует строку s ;
  • метод IsLetter() , определяющий есть ли символ c в строке s . Символ c задается входным параметром метода. Метод возвращает значение логического типа bool ;
  • метод Reverse() , принимающий входным параметром строку s и возвращающий реверсное значение этой строки.

Текст реализации класса следующий

Использование класса DemoString может быть следующим:

Пример 2. Объявляется класс Triangle , который содержит:

  • три внутренние переменные с именами a , b , c ;
  • параметризированный конструктор класса, получающий три параметра;
  • внутренний метод класса GetArea() , определяющий площадь треугольника по его сторонам a , b , c . Метод не получает параметров. Метод возвращает значение площади треугольника или 0, если по сторонам a , b , c нельзя построить треугольник;
  • внутренний метод класса без параметров IsTriangle() . Метод определяет, можно ли по трем сторонам a , b , c построить треугольник: сумма двух любых сторон должна быть больше третьей стороны. Метод возвращает логическое значение типа bool .

Текст объявления класса имеет следующий вид:

Использование класса Triangle и вызов методов класса может быть следующим:

6. Аргументы и формальные параметры метода

Аргументы метода – это значения которые передаются в метод во время вызова этого метода из другого метода или программного кода.
Формальные параметры метода – это переменные, которые получены методом как параметры и используются в этом методе. Формальные параметры метода описываются в скобках. Формальные параметры получают значения из аргументов при вызове метода.

Например. Пусть задан метод, который находит сумму цифр целого числа d , которое есть входным параметром

При вызове такого метода ему передается аргумент x , значение которого равно -2398. Этот аргумент передается формальному параметру d в методе Sum() .

7. Как параметры передаются в метод? Синтаксис описания параметров метода

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

Общая форма метода, который получает N параметров имеет вид:

  • return_type – тип, который возвращается методом MethodName ;
  • type1 , type2 , … typeN – типы параметров с именами param1 , param2 , …, paramN .

8. Использование ключевого слова void в параметрах методов

Если метод не получает параметров, то запись метода выглядит следующим образом:

где return_type – тип, который возвращает метод с именем MethodName() .

Например. Объявляется метод, который возвращает число Pi .

Если метод ничего не возвращает, то вместо типа указывается слово void

где parameter_list – список параметров метода с именем MethodName , которые он получает.

Если метод не возвращает и не получает параметров, то общий вид такого метода следующий:

Пример. Объявляется метод, который не получает и не возвращает ничего. В теле метода выводится сообщение «Hello world!» для консольных приложений.

9. Что значит термин «недоступный код» в методе?

Недоступный код – это часть кода метода, который никогда не будет выполнен. Недоступный код есть ошибкой программиста. Если в методе есть недоступный код, то компилятор выдает предупредительное сообщение соответствующего содержания.

Например. Ниже продемонстрирован метод, в котором есть недоступный (неиспользованный) код.

10. Пример, демонстрирующий различные способы возврата экземпляра класса из метода

В примере продемонстрированы различные способы возврата объекта класса из метода. По подобному примеру можно разрабатывать собственные методы, которые возвращают текущий экземпляр класса.

Задан класс Complex , реализующий комплексное число. В классе объявляются:

  • две внутренние переменные real , imag ;
  • два конструктора;
  • метод GetRI() , возвращающий значение внутренних переменных real и imag как out-параметров;
  • метод SetRI() , который с помощью параметров устанавливает новые значения внутренних переменных real , imag ;
  • метод GetComplex() , возвращающий текущий объект (экземпляр) класса Complex с помощью оператора return ;
  • метод GetComplex2() , возвращающий текущий объект (экземпляр) класса как out-параметр.В другом классе Program в функции main() продемонстрировано использование класса Complex и методов GetComplex() , GetComplex2() . Также в классе Program объявляется метод GetComplex3() , возвращающий экземпляр класса Complex .
    Текст всего программного модуля, созданного по шаблону Console Application следующий

Из вышеприведенного примера видно, что продемонстрировано возврат объекта класса Complex с помощью трех методов (способов):

Методы в языке C#

В языке С, дедушке языка C#, все было очень просто: данные это числа, строки, массивы; программный код – операторы языка и функции. Функции в C, говоря языком структурного программирования, это подпрограммы.

С переходом от императивного языка C к объектно-ориентированному языку C++ понятие функции (как подпрограммы) сохранилось, однако каждая функция стала принадлежать какому-либо классу. Отметим что в С++ были добавлены специальные функции – конструкторы и деструкторы.

В язык C#, являющийся прямым наследником языка C++, многое перенесено без особых изменений, однако введенная терминология поначалу может ввести вас в заблуждение.

Разберемся с терминами и понятиями более подробно.

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

Авторы языка определили, что функции-члены — это члены, которые обеспечивают некоторую функциональность для манипулирования данными класса. Они включают методы, свойства, конструкторы, финализаторы (деструкторы в С++), операции и индексаторы.

Для начинающего программиста важно освоить, прежде всего, работу с методами класса, а по сути (в прежнем понимании) – с функциями как подпрограммами. К этому добавим работу с конструкторами классов, а все остальное будет рассмотрено позже.

Шаблон объявления метода

[модификаторы] тип_возвращаемого_значения ИмяМетода([параметры])
<
// Тело метода
>
В C# определение метода состоит из указания модификаторов (static, public и т.п., модификаторы не обязательны), типа возвращаемого значения, имени метода и списка параметров в круглых скобках. Далее в фигурных скобках записывается тело метода.
Каждый параметр состоит из имени типа параметра и имени, по которому к нему можно обратиться в теле метода.

Возврат из метода и возврат значения

Если метод возвращает значение, то для указания точки выхода должен использоваться оператор возврата return вместе с возвращаемым значением. Если метод не возвращает ничего, то в качестве типа возврата указывается void (опустить тип возврата невозможно).

Если метод не принимает параметров, то все равно после имени метода должны присутствовать пустые круглые скобки (. ). При этом включать в тело метода оператор возврата не обязательно — метод возвращает управление автоматически по достижении закрывающей фигурной скобки.

В целом, возврат из метода может произойти при двух условиях. Во-первых, когда встречается фигурная скобка, закрывающая тело метода. И во-вторых, когда выполняется оператор return. Имеются две формы оператора return: одна — для методов типа void (возврат из метода), т.е. тех методов, которые не возвращают значения, а другая — для методов, возвращающих конкретные значения.

Читать:
Гласных больше чем согласных
Использование параметров

При вызове метода ему можно передать одно или несколько значений. Значение, передаваемое методу, называется аргументом. А переменная, получающая аргумент, называется формальным параметром, или просто параметром.

Параметры объявляются в скобках после имени метода. Синтаксис объявления параметров такой же, как и у переменных. А областью действия параметров является тело метода. За исключением особых случаев передачи аргументов методу, параметры действуют так же, как и любые другие переменные.

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

Если переменная, указанная в списке параметров, относится к типу значений (int, double, bool и т.п.), то вызываемый метод получает копию этой переменной, а это значит, что все изменения в ней, выполненные внутри метода будут утеряны.

Если переменная из списка параметров относится к ссылочному типу (например, массив), то параметр передается по ссылке, вызываемый метод получает саму переменную, поэтому любые изменения, которым она подвергнется внутри метода, останутся в силе после его завершения.

Поведение строк также отличается. Дело в том, что строки являются неизменными (изменение значения строки приводит к созданию совершенно новой строки), поэтому строки не демонстрируют поведение, характерное для ссылочных типов. Любые изменения, проведенные в строке внутри метода, не влияют на исходную строку.

Передача структуры (struct) как параметра через ее имя также произойдет через копирование (помните, структура относится к типу значений).

Если же для каких-либо типов данных необходима передача по ссылке (она более эффективна при большом объеме данных, который приходится копировать), то перед указанием типа параметра достаточно указать модификатор ref (reference – ссылка, англ.).

Рассмотрим три примера.

ПРИМЕР 1. В статье Первая программа на языке Си шарп мы разбирали программу:

В классе Program объявляется метод Main() (главная функция приложения), при выполнении которого вызываются два метода класса Console: WriteLine() (вывод строки текста) и ReadKey() (чтение символа с клавиатуры).

Ключевое слово static означает, что данный метод принадлежит классу Program.

Модификатор void указывает, что метод не возвращает никаких параметров.

Метод Main() в качестве списка параметров имеет массив строк. Отметим, что список параметров args в Main() пропустить. Метод WriteLine() имеет один параметр – строку, метод ReadKey() параметров не имеет.

ПРИМЕР 2. Объявление метода в примере Вычисление функции sin(x) выглядит так:

Параметром (аргументом) функции объявляется переменная x типа double, метод возвращает результат также типа double (последний оператор метода return s;). Метод является статическим. Для вызова метода достаточно написать оператор y=Sin2(x);

ПРИМЕР 3. Передача параметров по значению, ссылке и через статическую переменную

Объявим в классе Program структуру West с двумя полями, статическую переменную f и метод vp( ):
static void vp(int[] b, West u, string t, double d, ref decimal y)
где b – массив, u – структура, t – строка, d – вещественное число, y – десятичный тип, передается по ссылке (модификатор ref).

В методе изменим эти переменные, а также и f для того, чтобы проверить способы передачи параметров (копированием или по ссылке).

Напечатаем эти значения до и после вызова метода vp().

48

Результат:

Обратите внимание, что второй элемент массива a[1], десятичное число x (передаваемое через ссылку — ref) и статическая переменная f изменились, а структура u, строка t и вещественное число d не изменились.

Отметим, что статическое поле f, объявленное в классе, доступно методам этого класса без механизма передачи параметров.

Некоторые итоги:

1) переменные, объявленные внутри метода или в списке его параметров, являются локальными переменными;

2) при вызове метода параметры из списка в заголовке метода либо копируются в локальные переменные метода, либо передаются по ссылке;

3) копируются все встроенные типы значений, структуры и (по сути) строки, хотя и они относятся к ссылочным типам;

4) по ссылке передаются массивы и другие объекты. Если их поля будут изменены внутри вызываемого метода, то эти изменения сохранятся при возврате в вызывающий метод;

5) передачу параметров по ссылке (без копирования в локальные переменные метода) можно обеспечить, используя модификатор ref. Однако это не имеет смысла для переменных ссылочного типа («масло масленое»);

6) нет необходимости передавать статические переменные класса через список параметров, в рамках одного класса они имеют смысл глобальных переменных в императивных языках программирования (хотя термин «глобальная переменная» в C# не употребляют);

7) для доступа к данным-членам и функциям-членам других классов необходимо указать имя класса, поставить точку, указать имя члена класса, например: Math.PI — константа, число пи=3,14158… , Math.Tan(x) — тангенс числа x, заданного в радианах;

8) доступ к членам других классов зависит от уровня его приватности (public, но не private или protected).

Как и во многих языках программирования для реализации рекурсивных алгоритмов в C# можно использовать рекурсивные методы.

Завершим раздел рассмотрением двух из трех ключевых принципов ООП — наследования и полиморфизма, считаю принцип инкапсуляции (объединение данных и и методов в класс) уже достаточно ясным.

NEW: Наш Чат, в котором вы можете обсудить любые вопросы, идеи, поделиться опытом или связаться с администраторами.

What does void mean in C, C++, and C#?

Looking to get the fundamentals on where the term «void» comes from, and why it is called void. The intention of the question is to assist someone who has no C experience, and is suddenly looking at a C-based codebase.

15 Answers 15

Basically it means «nothing» or «no type»

There are 3 basic ways that void is used:

Function argument: int myFunc(void) — the function takes nothing.

Function return value: void myFunc(int) — the function returns nothing

Generic data pointer: void* data — ‘data’ is a pointer to data of unknown type, and cannot be dereferenced

Note: the void in a function argument is optional in C++, so int myFunc() is exactly the same as int myFunc(void) , and it is left out completely in C#. It is always required for a return value.

I have always taken it to mean absent. Here are four cases in the C language that matches to this use of absent

  • R f(void) — Function parameters are absent
  • void f(P) — Return value is absent
  • void *p — Type of what is pointed to is absent
  • (void) p — Usage of value is absent

Other C descendants use it for other things. The D programming language uses it for cases where an initializer is absent

  • T t = void; — initializing value is absent

Peter Mortensen's user avatar

Johannes Schaub - litb's user avatar

There are two ways to use void:

The first indicates that no argument is being passed or that no argument is being returned.

The second tells the compiler that there is no type associated with the data effectively meaning that the you can’t make use of the data pointed to until it is cast to a known type.

For example you will see void* used a lot when you have an interface which calls a function whose parameters can’t be known ahead of time.

For example, in the Linux kernel, when deferring work you will set up a function to be run at a latter time by giving it a pointer to the function to be run and a pointer to the data to be passed to the function:

Then a kernel thread goes over a list of deferred work and when it gets to this node it effectively executes:

Then in bar you have:

Peter Mortensen's user avatar

It means «no value». You use void to indicate that a function doesn’t return a value or that it has no parameters or both. Pretty much consistent with typical uses of word void in English.

It indicates the absence of a return value in a function.

Some languages have two sorts of subroutines: procedures and functions. Procedures are just a sequence of operations, whereas a function is a sequence of operations that return a result.

In C and its derivatives, the difference between the two is not explicit. Everything is basically a function. The void keyword indicates that it’s not an "actual" function, since it doesn’t return a value.

Peter Mortensen's user avatar

Three usage cases for void:

Function signatures. void foo(int bar) does not return a value. int bar(void) does not take any parameters but this is usually expressed with empty argument list: int bar() . Usage of the void keyword here corresponds to its meaning in English.

Generic top-type pointer void * that points to unspecified data and cannot be dereferenced. Here the meaning of void is different from other meanings of void: universal type vs. no type.

In casts such as (void) new Foo(this) to signify that the return value is deliberately thrown away. Here the keyword usage also matches its meaning in English.

Cases 1 and 2 were already covered by @Gerald but case 3 has not been addressed yet.

Think of void as the «empty structure». Let me explain.

Every function takes a sequence of parameters, where each parameter has a type. In fact, we could package up the parameters into a structure, with the structure slots corresponding to the parameters. This makes every function have exactly one argument. Similarly, functions produce a result, which has a type. It could be a boolean, or it could be float, or it could be a structure, containing an arbitrary set of other typed values. If we want a languge that has multiple return values, it is easy to just insist they be packaged into a structure. In fact, we could always insist that a function returned a structure. Now every function takes exactly one argument, and produces exactly one value.

Now, what happens when I need a function that produces «no» value? Well, consider what I get when I form a struct with 3 slots: it holds 3 values. When I have 2 slots, it holds two values. When it has one slot, one value. And when it has zero slots, it holds. uh, zero values, or «no» value». So, I can think of a function returning void as returning a struct containing no values. You can even decide that «void» is just a synonym for the type represented by the empty structure, rather than a keyword in the language (maybe its just a predefined type 🙂

Similarly, I can think of a function requiring no values as accepting an empty structure, e.g., «void».

I can even implement my programming language this way. Passing a void value takes up zero bytes, so passing void values is just a special case of passing other values of arbitrary size. This makes it easy for the compiler to treat the «void» result or argument. You probably want a langauge feature that can throw a function result away; in C, if you call the non-void result function foo in the following statement: foo(. ); the compiler knows that foo produces a result and simply ignores it. If void is a value, this works perfectly and now «procedures» (which are just an adjective for a function with void result) are just trivial special cases of general functions.

Void* is a bit funnier. I don’t think the C designers thought of void in the above way; they just created a keyword. That keyword was available when somebody needed a point to an arbitrary type, thus void* as the idiom in C. It actually works pretty well if you interpret void as an empty structure. A void* pointer is the address of a place where that empty structure has been put.

Casts from void* to T* for other types T, also work out with this perspective. Pointer casts are a complete cheat that work on most common architectures to take advantage of the fact that if a compound type T has an element with subtype S placed physically at the beginning of T in its storage layout, then casting S* to T* and vice versa using the same physical machine address tends to work out, since most machine pointers have a single representation. Replacing the type S by the type void gives exactly the same effect, and thus casting to/from void* works out.

The PARLANSE programming language implements the above ideas pretty closely. We goofed in its design, and didn’t pay close attention to «void» as a return type and thus have langauge keywords for procedure. Its mostly just a simple syntax change but its one of things you don’t get around to once you get a large body working code in a language.

Похожие статьи