Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Руководство_по_C#.doc
Скачиваний:
6
Добавлен:
01.07.2025
Размер:
10 Мб
Скачать
☆

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

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

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

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

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

namespace ConsoleApplication1

{

class myClass

{

public void someMethod(double[] myArr, int i, String s)

{

myArr[0] = 12.0; s = "New";

i = 12;

}

public void someMethod(double[] myArr, int i)

{

myArr[0] = 12.0;

i = 12;

}

}

class Program

{

static void Main(string[] args)

{

double[] arr1 = { 0, 1.5, 3.9, 5.1 };

int i = 0;

Console.WriteLine("Массив arr1 до вызова метода: ");

foreach (double d in arr1)

Console.Write("{0}\t", d);

Console.WriteLine("\nПеременная i = {0}\n", i);

Console.WriteLine("Вызов метода someMethod ...");

myClass ss = new myClass();

String fs = "Old";

ss.someMethod(arr1, i, fs);

Console.WriteLine("Массив arr1 после вызова метода:");

foreach (double d in arr1)

Console.Write("{0}\t", d);

Console.WriteLine("\n i = {0} fs={1}\n", i, fs);

String fs2 = "Old2";

fs = fs2;

Console.WriteLine(" fs = {0} fs2={1}", fs, fs2);

Console.ReadLine();

}

}

}

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

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

5.5Конструкторы

Конструктор инициализирует объект при его создании. У конструктора такое же имя, как и у его класса, а с точки зрения синтаксиса он подобен методу. Но у конструкторов нет возвращаемого типа, указываемого явно. Ниже приведена общая форма конструктора:

доступ имя_класса(список_параметров) {

// тело конструктора

}

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

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

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

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

namespace ConsoleApplication1

{

class MyClass

{

public string Name;

public byte Age;

// Создаем конструктор с параметрами

public MyClass(string s, byte b)

{

Name = s; Age = b;

}

public void reWrite()

{ Console.WriteLine("Имя: {0}\nВозраст: {1}", Name, Age); }

}

class Program

{

static void Main(string[] args)

{

MyClass ex = new MyClass("Alexandr", 26);

ex.reWrite(); //

Console.ReadLine();

}

}

}

//Имя: Alexandr

//Возраст: 26