Главная Обратная связь

Дисциплины:






Основы C#. Урок 25. Передача параметров переменой длины



В функцию можно передавать заранее неизвестное число параметров. Например, функция может складывать некоторое заранее неизвестное количество чисел и возвращать их сумму.

Вот конкретный пример реализации такой функции:

using System;class MyClass{publicstaticint Sum(paramsint[] args) { int res=0; for(int i=0; i<args.GetLength(0); i++){ res+=args[i]; } return res; }}namespace test{ class Test { publicstaticvoid Main() { System.Console.WriteLine(MyClass.Sum(1, 3)); System.Console.WriteLine(MyClass.Sum(12)); System.Console.WriteLine(MyClass.Sum(-1, 9, 2)); } }}

Здесь в классе MyClass мы объявляем статческую фунцкию Sum, в которую мы можем передавать переменное число параметров. Для этого в круглых скобках после имени функции мы пишем конструкцию

...publicstaticint Sum(paramsint[] args)...

Синтаксис у нее такой - сначала пишем ключевое слово params, затем - тип параметров (int в данном случае), после которого ставим пустые квадратные скобки и в конце этой конструкции пишем произвольное имя параметра (в нашем примере он назван args).

В классе test мы испытываем наш класс MyClass, а именно, вызываем функцию Sum с разным числом параметров. Все работает как надо и наша программа покажет на экране 4, 12 и 10.

Основы C#. Урок 26. Строки (класс System.String)

Строки в C# - это экземпляры класса System.String. Вообще говоря в C# есть тип string, но класс System.String яляется более продвинутым, так что его использование часто оказывается более оправданным и простым. Этот класс имеет множество методов и свойств, некоторые из которых перечислены ниже:

Свойство Length. Возвращает длину строки. Пример использования:

String s="qqq"; int k=s.Length; //В k запишется 3

Compare. Статический метод, сравнивающий две строки. Возвращает 0, есть строки равны, отрицательное значение, если первая строка меньше второй и положительное значение, если первая строки больше второй (больше и меньше в алфавитном смысле, разумеется). Пример использования:

namespace test{ class Test { publicstaticvoid Main() { String s1="arbour", s2="ace", s3="azote"; System.Console.WriteLine(String.Compare(s1, s1)); //Выдаст 0, т. к. "arbour" равно "arbour". System.Console.WriteLine(String.Compare(s1, s2)); //Выдаст -1, т. к. "arbour" меньше "ace". System.Console.WriteLine(String.Compare(s1, s3)); //Выдаст 1, т. к. "arbour" больше "azote". } }}

Equals. Метод, возвращает true, если строки равны, false - если не равны. Может быть как статическим, так и не статическим. Пример использования:



String s1="qqq", s2="www"; System.Console.WriteLine(String.Equals(s1, s2).ToString()); //Статический метод System.Console.WriteLine(System.Console.WriteLine(String.Equals(s1, s2).ToString()); //Не статический метод System.Console.WriteLine(s1.Equals(s2).ToString());.ToString());

Метод Substring. Поволяет извлечь из строки подстроку. Пример использования:

String s1="abcdefg", s2; s2=s1.Substring(3, 2); System.Console.WriteLine(s2); //Напечатается "de"

Параметры тут такие: первый - с какого места извлекаем (нумерация с нуля) и второй - сколько символов извлекаем.

Метод Insert. Вставляет в строку другую строку. Пример использования:

String s1="abcdefg", s2; s2=s1.Insert(1, "xyz"); System.Console.WriteLine(s2); //Напечатается "axyzbcdefg"

Первый параметр тут - это куда вставляем (нумерация, как всегда, с нуля), второй - что за строчку вставляем.

Метод IndexOf. Позволяет найти в строке подстроку. Пример использования:

String s1="abcabcab", s2="bc", s3="zzz"; System.Console.WriteLine(s1.IndexOf(s2)); //Напечатается 1 System.Console.WriteLine(s1.IndexOf(s3)); //Напечатается -1

Этот метод возвращает номер позиции, на котором в строке находится передаваемая в качестве параметра подстрока. Если такой построки нет, то возвращается -1.

Метод Replace. Производит замену в строке. Пример использования:

String s1="abcabcab", s2="bc", s3; s3=s1.Replace(s2, "q"); System.Console.WriteLine(s3); //Напечатается aqaqab

Методы EndWith и StartsWith. Проверяют, не завершается ли или не начинается ли строка с или на заданную строку соответственно. Пример использования:

String s1="arbour"; if(s1.StartsWith("ar")) System.Console.WriteLine("Строка начинается на \"ar\""); else System.Console.WriteLine("Строка не начинается на \"ar\"");

Методы ToUpper и ToLower переводят строку в верхний или нижний регистр соответственно. Пример использования:

String s1="aRbRur"; s1=s1.ToLower();

Методы Trim, TrimEnds и TrimStart. Удаляют пробельные символы из начала и конца строки (Trim), только с конца строки (TrimEnds) и только с начала строки (TrimStart). Пример использваония:

String s1=" ar brur "; System.Console.Write(s1.Trim());

Заметьте, что при изменении строки фактически старый экземпляр класса System.String уничтожается, и создается новый с там же именем и измененным содержанием. Это означает, что при интенсивной работе со строками программа может работеть не так быстро, как хотелось бы. Если мы не хотим, что бы каждый раз создавался новый экземпляр класса, то вместо класса System.String надо использовать класс StringBuilder, котрый мы рассмотрим на следующем уроке.

Основы C#. Урок 27. Строки (класс StringBuilder)

На этом уроке мы рассмотрим другой класс для работы со строками - класс StringBuilder. Он принадлежит пространству имен System.Text

Этот класс работет быстрее, чем класс String, так как при изменении строки, созданной как экземпляр класса String, у нас создается каждый раз новый экземпляр класса, а старый уничтожается, при использовании же класса StringBuilder расходов на создание-уничтожение экземпляра класса нет - мы работаем всегда с одним экземпляром.

Обратите внимание, что для этого класса мы не можем использовать простое присваивание:

StringBuilder s="abc"; //Неправильно!

В этом случае мы долны действовать так:

StringBuilder s=new StringBuilder("abc"); //Правильно

У класса StringBuilder нет статических методов. Все его методы - динамические. Ниже перечислены основные свойства и методы класса StringBuilder:

Свойство Length. Возвращает длину строки. Пример использования:

int k=s.Length;

Свойство только для чтения MaxCapacity. Дает максимальное количество символов, которые можно записать в объект типа StringBuilder. Пример использования:

System.Console.WriteLine(s.MaxCapacity);

Метод Append. Прибавляет строку к существующей. Пример использования:

StringBuilder s1=new StringBuilder("Cogito "); StringBuilder s2=new StringBuilder("ergo "); s1.Append(s2); s1.Append("sum"); System.Console.WriteLine(s1); //Напечатается "Cogito ergo sum"

Метод Equals. Служит для сравнения двух строк. Возвращает true или false. Пример использования:

if(s1.Equals(s2)) System.Console.WriteLine("Строки равны"); else System.Console.WriteLine("Строки не равны");

Метод Insert. Вставляет символы в заданную позицию (Нумерация идет с нуля). Пример использования:

StringBuilder s1=new StringBuilder("abcde"); s1.Insert(2, "xyz"); System.Console.WriteLine(s1); //Напечатается "abxyzcde"

Метод Remove. Удаляет символы из строки. Пример использования:

StringBuilder s1=new StringBuilder("abcde"); s1.Remove(1, 2); System.Console.WriteLine(s1); //Напечатается "ade"

Певый параметр у Remove - это с какой позиции удаляем (нумерация с нуля), второй - сколько символов удаляем.

Метод Replace. Заменяет символы. Пример использования:

StringBuilder s=new StringBuilder("abcdeabcde"); s.Replace("abc", "ZZZ"); System.Console.WriteLine(s); //Напечатается "ZZZdeZZZde"

 

Основы C#. Урок 28. Передача параметров по ссылке и по значению (ref и out)

Если мы передаем в некоторую функцию параметр, то функция по умолчанию работает с копией параметра, а не с оригиналом. Это называется перередача по значению. При этом при изменении передаваемого параметра внутри функции значение соответствующей переменной вне функции не изменится. Иногда же нам надо, что бы функция действительно изменяла передаваемые в нее параметры. Для этого мы должны передавать их по ссылке. Для этого мы используем ключевое слово ref. Вот пример:

class Test { staticvoid SomeFunction1(int a) { a=12; //Изменяем копию параметра функции } staticvoid SomeFunction2(refint a) { a=55; //Изменяем оригинал параметра функции } publicstaticvoid Main() { int z=23; SomeFunction1(z); Console.WriteLine(z); //Напечатается 23 SomeFunction2(ref z); Console.WriteLine(z); //Напечатается 55 } }

Обратите внимание, что при вызове функции SomeFunction2 мы опять используем ключевое слово ref (как и при объявлении этой функции):

... SomeFunction2(ref z); ...

Параметр out аналогичен параметру ref, только при его использовании в функцию можно передавать неинициализированные переменные (т. е. переменные с незаданными начальными значениями). Вот пример:

class Test { staticvoid SomeFunction2(refint a) { a=55; } staticvoid SomeFunction3(outint a) { a=66; } publicstaticvoid Main() { int z=0; //Переменную z надо обязательно инициализировать SomeFunction2(ref z); Console.WriteLine(z); //Напечатается 55 int y; //Переменную y можно не инициализировать SomeFunction3(out y); Console.WriteLine(y); //Напечатается 66 } }

При вызове такой функции обязательно использование ключевого слова out.





sdamzavas.net - 2019 год. Все права принадлежат их авторам! В случае нарушение авторского права, обращайтесь по форме обратной связи...