Параметры методов: параметры-значения, параметры-ссылки, выходные параметры
При вызове метода выполняются следующие действия:
1. Вычисляются выражения, стоящие на месте аргументов.
2. Выделяется память под параметры метода в соответствии с их типом.
3. Каждому из параметров сопоставляется соответствующий аргумент.
4. Выполняется тело метода.
5. Если метод возвращает значение, оно передается в точку вызова; если метод имеет тип void управление передается на оператор, следующий после вызова.
Параметры-значения
Параметры-значения указываются в заголовке метода своим типом и именем. Имя параметра может быть произвольным. Параметр-значение представляет собой локальную переменную, которая получает свое значение из вызывающего блока при вызове метода. Заголовок имеющий один параметр-значение целого типа, может выглядеть так:
voidB(intz);
Отличительной чертой параметров-значений является следующее: при вызове метода из ячейки памяти, в которой хранится переменная, передаваемая в метод, берется ее значение и копируется в специальную область памяти. По завершении работы метода область параметров освобождается.
Основное достоинство способа передачи параметров по значению — защита значений переменных в вызывающем блоке от непреднамеренных изменений. Недостаток его — увеличение объема используемой памяти.
Параметры-ссылки
В метод передается ссылка на аргумент, а не сам аргумент. Сама ссылка копируется. Эта ссылка используется для доступа к области памяти, в которой хранится аргумент. Такая передача называется передачей «по ссылке» а параметры, переданные посредством ссылки называются параметрами-ссылками. В такой ситуации метод работает непосредственно с переменной из вызывающего блока, и, следовательно может ее изменить. Способ передачи параметра по адресу устанавливает сам программист в заголовке метода следующим образом:ref тип имя.Параметры-ссылки рекомендуется использовать лишь в тех случаях, когда метод должен возвращать более одной величины.
Выходные параметры-значения
Довольно часто возникает необходимость в методах, которые сами формируют несколько величин, например если в методе создаются объекты или инициализируются ресурсы. В этом случае становится неудобным ограничение параметров-ссылок: необходимость присваивания значения аргументу до вызова метода. Это ограничение снимает спецификатор out. Параметру, имеющему этот спецификатор обязательно должно быть присвоено значение.
При вызове метода перед соответствующим параметром тоже указывается ключевое слово out
В списке параметров записывайте сначала все сходные параметры, затем — все ссылки и выходные параметры.
Вопрос 46
Ключевое слово this
Каждый объект содержит свой экземпляр полей класса. Методы находятся в памяти в единственном экземпляре и используются всеми объектами совместно. Поэтому необходимо обеспечить работу методов нестатических экземпляров с полями именно того объекта, для которого они были вызваны. Для этого в любой нестатический метод автоматически передается скрытый параметр this в котором хранятся ссылка на вызывавший функцию экземпляр. В явном виде параметр this применяется для того, чтобы возвратить из метода ссылку на вызвавший объект, а также для идентификации поля в случае, если его имя совпадает с именем параметра метода.
Class Demo
{Double y;
PublicDemoT() //метод возвращает ссылку на экземпляр
{ Return this;}
Public void Set y (double y)
{This.y=y; // у присваивает значение параметру у}
}
Вопрос 47
Конструкторы. Примеры
Конструктор предназначен для инициализации объекта. Он вызывается автоматически при создании объекта класса с помощью операции new. Имя конструктора совпадает с именем класса. Свойства конструкторов:
- Конструктор не возвращает значение
- Класс может иметь несколько конструкторов с разными параметрами для разных видов инициализации.
- Если программист не указал ни одного конструктора или какие-то поля не были инициализированы, полям значимых типов присваивается нуль, полям ссылочных типов — значение null.
- Конструктор вызываемый без параметров называется конструктором по умолчанию.
В класс Prim добавлен конструктор а поля сделаны закрытыми. В программе создаются два объекта с различными значениями полей:
classPrim {
рublicPrim(inta, double у) // конструктор с параметрами
{
this.a = а;
this.y = у;
}
рublicdoubleGetу() // метод получения поля у
{
return y;
}
int a;
double у;
}
class Class1
{ static void Main( )
{
Prim a = new Prim( 10, 0.01 ); // вызовконструктора
Соnsole.WriteLine( a.Gety( ) ); // результат: 0,01
Primb = newPrim( 1. 2.2 ): // вызов конструктора
Соnsole.WriteLine( b.Gety( ) ); // результат: 2,2
}
}
}
Конструктор базового класса называется явным образом в тех случаях, когда ему требуется передать параметры. До этого были конструкторы экземпляра. Существует второй тип конструкторов — статические конструкторы или конструкторы класса. Статический конструктор не имеет параметров, его нельзя вызвать явным образом.
Вопрос 48
Свойства классов
Свойства служат для организации доступа к полям класса. Как правило, свойство связано с закрытым полем класса и определяет методы его получения и установки. Синтаксис свойства:
[атрибуты][спецификаторы] тип имя_свойства
{
[get код_доступа]
[set код_доступа]
}
Чаще всего свойства объявляются как открытые (со спецификатором public) поскольку они входят в интерфейс объекта.
Код доступа представляет собой блоки операторов которые выполняются при получении (get) или установке (set) свойства.
Спецификаторы доступа для отдельной части должны задавать либо такой же, либо более ограниченный доступ, чем спецификатор доступа для свойства в целом. Например если свойство описано как publicего части могут иметь любой спецификатор доступа, а если свойство имеет доступ protectedinternal, его части могут объявляться как internal, protectedилиprivate.
Синтаксис свойства имеет вид:
[атрибуты][спецификаторы] тип имя_свойства
{
[[атрибуты][спецификаторы]get код_доступа]
[[атрибуты][спецификаторы]set код_доступа]
}
С помощью свойств можно отложить инициализацию поля до того момента, когда оно фактически потребуется.
Вообще говоря, свойство может и не связываться с полем. Фактически, оно описывает один или два метода, которые осуществляют некоторые действия над данными того же типа, что и свойство. В отличие от открытых полей, свойства обеспечивают разделение между внутренним состоянием объекта и его интерфейсом, и таким образом упрощают внесение изменений в класс.