Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
otvety_na_bilety_YaP_1-21_23.docx
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
722.66 Кб
Скачать

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

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

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

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

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

namespace ConsoleApplication1

{

class myClass

{

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();

ss.someMethod(arr1,i);

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

foreach (double d in arr1)

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

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

Console.ReadLine();

}

}

}

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

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

Статическим называется метод, который существует в классе как таковом, а не в отдельных его экземплярах. Как и в случае других статических членов, главное преимущество статических методов в том, что они расположены вне конкретных экземпляров класса и не засоряют глобальное пространство приложения. При этом они и не нарушают принципов ООП, поскольку ассоциированы с определенным классом. Примером может служить API баз данных, представленный ниже. В той иерархии классов есть класс SQLServerDb. Помимо базовых операций для работы с БД (new, update, read и delete), класс содержит метод, предназначенный для восстановления БД. В методе Repair не нужно открывать саму БД. Следует использовать функцию ODBC SQLConfigDataSource, которая предполагает, что БД закрыта. Однако конструктор SQLServerDb открыл БД, указанную переданным ему именем. Поэтому здесь очень удобно использовать статический метод. Это позволит поместить метод в класс SQLServerDb, к которому он принадлежит, и даже не обращаться к конструктору класса. Очевидно, выгода клиента в том, что он также не должен создавать экземпляр класса SQLServerDb. В следующем примере вы можете видеть вызов статического метода (RepairDatabase) из метода Main. Заметьте, что для этого не создается экземпляр SQLServerDB:

using System; class SQLServerDb { public static void RepairDatabase() { Console.WriteLine("восстановление базы данных..."); } } class StaticMethodlApp { public static void Main() { SQLServerDb.RepairDatabase();  } }

Определить метод как статический позволяет ключевое слово static. Затем для вызова метода пользователь применяет синтаксис вида Класс.Метод. Этот синтаксис необходим, даже если у пользователя есть ссылка на экземпляр класса. Данный момент можно проиллюстрировать кодом, который не будет компилироваться:

using System; class SQLServerDb { public static void RepairDatabase() { Console.WriteLine("восстановление базы данкых..."); } } class StacicMethod2App { public static void Main() { SQLServerDb db = new SQLServerDb(); db.RepairDatabase();  } }

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

using System; class SQLServerDb { static string progressStringl = "repairing database..."; string progressString2 = "repairing database..."; public static void RepairDatabase() { Console.WriteLine(progressStringl); /* compiled normally */ Console.WriteLine(progressString2); /* error on compilation */ } } /* compilation */ class StaticMethod3App { public static void Main() { SQLServerDb.RepairDatabase();  } }

Компилятор не пропустит этот код, потому что он содержит ошибку. Статический метод пытается обратиться к нестатической переменной класса. Это недопустимо в С#.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]