Главная страница
Навигация по странице:

  • Результат выполнения программы (из листинга 3.5)

  • Результат выполнения программы (из листинга 3.7)

  • Васильев А.Н. Основы программирования на C#. Васильев А. Н. Программирование


    Скачать 5.54 Mb.
    НазваниеВасильев А. Н. Программирование
    АнкорВасильев А.Н. Основы программирования на C
    Дата20.09.2022
    Размер5.54 Mb.
    Формат файлаpdf
    Имя файлаVasilev_Programmirovanie-na-C-dlya-nachinayushchih-Osobennosti-y.pdf
    ТипДокументы
    #686596
    страница12 из 40
    1   ...   8   9   10   11   12   13   14   15   ...   40
    146
    //
    ɋɨɞɟɪɠɢɦɨɟ ɦɚɫɫɢɜɚ:
    A.show();
    Console.WriteLine(
    Ǝɗɤɡɟɦɩɥɹɪ B:Ǝ);
    //
    ɋɨɞɟɪɠɢɦɨɟ ɦɚɫɫɢɜɚ:
    B.show();
    Ниже показан результат выполнения программы:
    
    Результат выполнения программы (из листинга 3.3)
    ɗɤɡɟɦɩɥɹɪ A:
    |A|B|C|D|E|F|G|
    ɗɤɡɟɦɩɥɹɪ B:
    |A|B|C|D|E|F|G|
    ɗɤɡɟɦɩɥɹɪ A:
    |X|B|C|D|E|F|Y|
    ɗɤɡɟɦɩɥɹɪ В программе мы описали структуру MyStruct, у которой есть открытое поле symbs
    , являющееся ссылкой на символьный массив. Также в структуре описан метод show(), который при вызове отображает в консольном окне содержимое массива, на который ссылается поле symbs экземпляра структуры.
    В главном методе программы командой MyStruct A,B создаются два экземпляра структуры. Затем командой A.symbs=new char[7] создается массив, и ссылка на этот массив записывается в поле symbs экземпляра. С помощью оператора цикла созданный массив последовательно заполняется символами, начиная с символа
    ƍAƍ. Содержимое массива проверяем с помощью команды A.show(). Затем выполняется присваивание команда B=A). В результате полю symbs экземпляра B присваивается значение поля symbs экземпляра A. Но значение поля symbs экземпляра A — это ссылка на созданный ранее массив. Получается, что поле symbs экземпляра будет ссылаться на точно тот же массив. При выполнении команды
    B.show()
    действительно получаем уже знакомую нам последовательность
    Перечисления и структуры
    147
    символов. Но чтобы убедиться, что поля в экземплярах A и B ссылаются на один и тот же массива не на два одинаковых массива, используем команды A.symbs[0]=
    ƍXƍ и B.symbs[B.symbs.Length-1]=ƍYƍ. Первой командой меняется значение начального элемента в массиве, на который ссылается поле из экземпляра A, а второй командой меняется значение последнего элемента в массиве, на который ссылается поле из экземпляра. После выполнения команд A.show() и B.show() убеждаемся, что экземпляры действительно ссылаются на один и тот же массив.
    Массив экземпляров структуры Это плохо Плохо Ответьте, уважаемый доктор Это бесподобно.
    из к/ф Собачье сердце»
    Некоторый практический интерес может представлять ситуация, когда создается массив экземпляров структуры. Рассмотрим программу, представленную в листинге Листинг 3.4. Массив экземпляров структуры System;
    //
    ɋɬɪɭɤɬɭɪɚ:
    struct MyStruct{
    public int code;
    }
    //
    Ʉɥɚɫɫ ɫ ɝɥɚɜɧɵɦ ɦɟɬɨɞɨɦ:
    class StructArrayDemo{
    //
    Ƚɥɚɜɧɵɣ ɦɟɬɨɞ:
    static void Main(){
    //
    Ɋɚɡɦɟɪ ɦɚɫɫɢɜɚ:
    int size=7;
    //
    ɋɨɡɞɚɧɢɟ ɦɚɫɫɢɜɚ ɢɡ ɷɤɡɟɦɩɥɹɪɨɜ ɫɬɪɭɤɬɭɪɵ:
    MyStruct[] A=new MyStruct[size];
    //
    ɉɟɪɟɛɨɪ ɷɤɡɟɦɩɥɹɪɨɜ ɫɬɪɭɤɬɭɪɵ ɜ ɦɚɫɫɢɜɟ:
    Глава 3
    148
    for(int k=0;k //
    ɉɨɥɸ ɷɤɡɟɦɩɥɹɪɚ ɩɪɢɫɜɚɢɜɚɟɬɫɹ ɡɧɚɱɟɧɢɟ:
    A[k].code=2*k+1;
    //
    Ɉɬɨɛɪɚɠɚɟɬɫɹ ɡɧɚɱɟɧɢɟ ɩɨɥɹ ɷɤɡɟɦɩɥɹɪɚ:
    Console.Write(
    Ǝ|Ǝ+A[k].code);
    }
    Console.WriteLine(
    Ǝ|Ǝ);
    Результат выполнения программы следующий:
    
    Результат выполнения программы (из листинга Программа очень простая. В ней описана структура MyStruct, в которой всего одно открытое целочисленное поле code. В методе Main() с помощью команды MyStruct[] A=new MyStruct[size] создается массив из экземпляров структуры (переменной size предварительно присвоено значение 7). Элементами созданного массива являются экземпляры структуры. Поле code каждого из экземпляров не инициализировано. Поэтому после создания массива мы присваиваем значения полю code каждого из экземпляров. Для этого запускается оператор цикла с индексной переменной k. Количество элементов в массиве определяем выражением. При заданном значении индекса k обращение
    ɤ экземпляру структуры выглядит как A[k], а обращение к полю code такого экземпляра выполняется в формате A[k].code. В экземпляры структуры записываются нечетные числа, которые затем отображаются в консольном окне.
    Структуры и метод Как вы яхту назовете, так она и поплывет.
    из м/ф Приключения капитана Врунгеля»
    Хотя структуры не поддерживают наследование, они встроены в иерархию наследования. Поэтому для структур также, как и для классов,
    Перечисления и структуры
    149
    можно переопределить метод ToString(). В листинге 3.5 поэтому поводу представлен небольшой пример.
    
    Листинг 3.5. Структуры и метод ToString()
    using System;
    //
    ɋɬɪɭɤɬɭɪɚ:
    struct MyStruct{
    //
    Ɉɬɤɪɵɬɨɟ ɬɟɤɫɬɨɜɨɟ ɩɨɥɟ:
    public string name;
    //
    Ɉɬɤɪɵɬɨɟ ɰɟɥɨɱɢɫɥɟɧɧɨɟ ɩɨɥɟ:
    public int code;
    //
    Ʉɨɧɫɬɪɭɤɬɨɪ ɫ ɞɜɭɦɹ ɚɪɝɭɦɟɧɬɚɦɢ:
    public MyStruct(string name,int code){
    //
    ɉɪɢɫɜɚɢɜɚɧɢɟ ɡɧɚɱɟɧɢɹ ɩɨɥɹɦ:
    this.name=name;
    this.code=code;
    }
    //
    ɉɟɪɟɨɩɪɟɞɟɥɟɧɢɟ ɦɟɬɨɞɚ ToString():
    public override string ToString(){
    //
    Ɍɟɤɫɬɨɜɚɹ ɫɬɪɨɤɚ:
    string txt=
    Ǝɗɤɡɟɦɩɥɹɪ \ƎƎ+name+Ǝ\Ǝ\nƎ;
    txt+=
    Ǝɑɢɫɥɨɜɨɟ ɩɨɥɟ: Ǝ+code+Ǝ\nƎ;
    //
    Ɋɟɡɭɥɶɬɚɬ ɦɟɬɨɞɚ:
    return txt;
    }
    }
    //
    Ʉɥɚɫɫ ɫ ɝɥɚɜɧɵɦ ɦɟɬɨɞɨɦ:
    class StructToStringDemo{
    //
    Ƚɥɚɜɧɵɣ ɦɟɬɨɞ:
    static void Main(){
    //
    ɋɨɡɞɚɧɢɟ ɷɤɡɟɦɩɥɹɪɨɜ ɫɬɪɭɤɬɭɪɵ:
    MyStruct A=new MyStruct(
    ƎAlphaƎ,100);
    Глава 3
    150
    MyStruct B=new MyStruct(
    ƎBravoƎ,200);
    //
    Ɉɩɟɪɚɰɢɢ ɫ ɷɤɡɟɦɩɥɹɪɚɦɢ:
    Console.WriteLine(A);
    string text=B+
    Ǝȼɵɩɨɥɧɟɧɢɟ ɩɪɨɝɪɚɦɦɵ ɡɚɜɟɪɲɟɧɨƎ;
    Console.WriteLine(text);
    Результат выполнения программы представлен ниже:
    
    Результат выполнения программы (из листинга 3.5)
    ɗɤɡɟɦɩɥɹɪ ƎAlphaƎ
    ɑɢɫɥɨɜɨɟ ɩɨɥɟ: 100
    ɗɤɡɟɦɩɥɹɪ ƎBravoƎ
    ɑɢɫɥɨɜɨɟ ɩɨɥɟ: 200
    ȼɵɩɨɥɧɟɧɢɟ ɩɪɨɝɪɚɦɦɵ У структуры MyStruct два открытых поля текстовое name и целочисленное. В структуре описан конструктор с двумя аргументами. Эти аргументы определяют значения полей создаваемого экземпляра структуры ПОДРОБНОСТИ bАргументы конструктора имеют такие же названия, как и поля. Поэтому в теле конструктора использовано ключевое слово this
    , обозначающее экземпляр структуры. Обращение к полям выполняется инструкциями вида this.name и this.code
    , а идентификаторы name ив теле конструктора означают аргументы.
    Также в структуре описан (переопределен) метод ToString(). Результатом метод возвращает текстовую строку, которая содержит информацию о значениях полей экземпляра структуры
    Перечисления и структуры НАЗ А МЕТКУ При описании метода
    ToString()
    используется ключевое слово В главном методе программы командами MyStruct A=new MyStruct
    (
    ƎAlphaƎ,100) и MyStruct B=new MyStruct(ƎBravoƎ,200) создаются экземпляры A и B структуры. При выполнении команды Console.
    WriteLine(A)
    для экземпляра A вызывается метод ToString(), и текстовая строка, возвращаемая этим методом, отображается в консольном окне. Затем объявляется текстовая переменная text, в качестве значения которой присваивается выражение B+
    Ǝȼɵɩɨɥɧɟɧɢɟ ɩɪɨɝɪɚɦɦɵ
    ɡɚɜɟɪɲɟɧɨƎ. Значение этого выражения вычисляется так для экземпляра вызывается метод ToString(), и полученная в результате строка объединяется со вторым текстовым операндом выражения. Значение текстовой переменной text отображается в консольном окне (команда Свойства и индексаторы в структурах

    Все глупости в мире бывают только от умных разговоров.
    из к/ф «Айболит-66»
    В структурах можно использовать индексаторы и свойства. Принцип реализации этих членов структуры такой же, как ив случае с классами. Программа, в которой есть структура с индексаторами и свойствами, представлена в листинге Листинг 3.6. Свойства и индексаторы в структурах System;
    //
    ɋɬɪɭɤɬɭɪɚ:
    struct MyStruct{
    //
    Ɂɚɤɪɵɬɨɟ ɬɟɤɫɬɨɜɨɟ ɩɨɥɟ:
    private string txt;
    //
    Ɍɟɤɫɬɨɜɨɟ ɫɜɨɣɫɬɜɨ:
    Глава 3
    152
    public string text{
    //
    Ⱥɤɫɟɫɫɨɪ ɞɥɹ ɫɱɢɬɵɜɚɧɢɹ ɡɧɚɱɟɧɢɹ ɫɜɨɣɫɬɜɚ:
    get{
    return txt;
    }
    //
    Ⱥɤɫɟɫɫɨɪ ɞɥɹ ɩɪɢɫɜɚɢɜɚɧɢɹ ɡɧɚɱɟɧɢɹ ɫɜɨɣɫɬɜɭ:
    set{
    txt=value;
    }
    }
    //
    ɐɟɥɨɱɢɫɥɟɧɧɨɟ ɫɜɨɣɫɬɜɨ (ɞɨɫɬɭɩɧɨ ɞɥɹ ɱɬɟɧɢɹ):
    public int length=>txt.Length;
    //
    ɂɧɞɟɤɫɚɬɨɪ ɫ ɰɟɥɨɱɢɫɥɟɧɧɵɦ ɢɧɞɟɤɫɨɦ:
    public char this[int k]{
    //
    Ⱥɤɫɟɫɫɨɪ ɞɥɹ ɫɱɢɬɵɜɚɧɢɹ ɡɧɚɱɟɧɢɹ:
    get{
    return txt[k];
    }
    //
    Ⱥɤɫɟɫɫɨɪ ɞɥɹ ɩɪɢɫɜɚɢɜɚɧɢɹ ɡɧɚɱɟɧɢɹ:
    set{
    //
    ɉɪɟɨɛɪɚɡɨɜɚɧɢɟ ɬɟɤɫɬɚ ɜ ɫɢɦɜɨɥɶɧɵɣ ɦɚɫɫɢɜ:
    char[] s=txt.ToCharArray();
    //
    Ɂɚɦɟɧɚ ɫɢɦɜɨɥɚ ɜ ɦɚɫɫɢɜɟ:
    s[k]=value;
    //
    ɉɪɟɨɛɪɚɡɨɜɚɧɢɟ ɦɚɫɫɢɜɚ ɜ ɬɟɤɫɬ:
    txt=new string(s);
    }
    }
    }
    //
    Ʉɥɚɫɫ ɫ ɝɥɚɜɧɵɦ ɦɟɬɨɞɨɦ:
    class StructAndIndPropDemo{
    //
    Ƚɥɚɜɧɵɣ ɦɟɬɨɞ:
    Перечисления и структуры static void Main(){
    //
    ɋɨɡɞɚɧɢɟ ɷɤɡɟɦɩɥɹɪɚ ɫɬɪɭɤɬɭɪɵ:
    MyStruct A=new MyStruct();
    //
    ɉɪɢɫɜɚɢɜɚɧɢɟ ɡɧɚɱɟɧɢɹ ɬɟɤɫɬɨɜɨɦɭ ɫɜɨɣɫɬɜɭ:
    A.text=
    ƎAlphaƎ;
    //
    ɉɪɨɜɟɪɤɚ ɡɧɚɱɟɧɢɹ ɬɟɤɫɬɨɜɨɝɨ ɫɜɨɣɫɬɜɚ:
    Console.WriteLine(A.text);
    //
    ɂɫɩɨɥɶɡɨɜɚɧɢɟ ɢɧɞɟɤɫɚɬɨɪɚ ɢ
    //
    ɰɟɥɨɱɢɫɥɟɧɧɨɝɨ ɫɜɨɣɫɬɜɚ:
    for(int k=0;k Console.Write(
    Ǝ|Ǝ+A[k]);
    }
    Console.WriteLine(
    Ǝ|Ǝ);
    //
    ɂɫɩɨɥɶɡɨɜɚɧɢɟ ɢɧɞɟɤɫɚɬɨɪɚ ɢ
    //
    ɰɟɥɨɱɢɫɥɟɧɧɨɝɨ ɫɜɨɣɫɬɜɚ:
    A[0]=
    ƍaƍ;
    A[A.length-1]=
    ƍAƍ;
    //
    ɉɪɨɜɟɪɤɚ ɡɧɚɱɟɧɢɹ ɬɟɤɫɬɨɜɨɝɨ ɫɜɨɣɫɬɜɚ:
    Console.WriteLine(A.text);
    Ниже представлен результат выполнения программы:
    
    Результат выполнения программы (из листинга В нашем примере структура MyStruct содержит закрытое текстовое поле txt, а также имеет текстовое свойство text. При считывании значения свойства возвращается значение поля txt. При присваивании значения свойству значение присваивается полю txt.
    Глава Еще одно свойство length является целочисленным. Оно доступно только для считывания. В качестве значения свойства возвращается размер текста в текстовом поле txt (выражение txt.Length). При определении свойства был использован упрощенный синтаксис на основе лямбда-выражения.
    Индексатор с целочисленным индексом (обозначен как k) определен так, что результатом возвращается символ из поля txt с соответствующим индексом (выражение txt[k]). При присваивании символьного значения проиндексированному экземпляру структуры в текстовом поле txt меняется значение символа сданным индексом. Поскольку текстовые значения неизменны, то технически все реализуется следующим образом (код set-аксессора для индексатора). Сначала командой char[] s=
    txt.ToCharArray()
    на основе текста из текстового поля txt создается символьный массив s. Затем командой s[k]=value в этом символьном массиве меняется значение элемента с индексом k (индекс в квадратных скобках после имени экземпляра структуры. После этого командой txt=new string(s) на основе символьного массива создается текстовый объект, и ссылка на него записывается в поле В главном методе программы командой MyStruct A=new MyStruct() создаем экземпляр структуры. С помощью команды A.text=
    ƎAlphaƎ текстовому свойству этого экземпляра присваивается значение. Проверку значения текстового свойства выполняем командой
    Console.WriteLine(A.text)
    {
    i
    НАЗ А МЕТКУ Если попытаться вместо команды использовать команду
    MyStruct
    A
    , то программа не скомпилиру- ется. Дело в том, что при создании экземпляра структуры командой закрытое полене инициализируется, и поэтому попытка обращения к свойству text будет заблокирована. Если для создания экземпляра структуры используется команда
    MyStruct
    A=new
    MyStruct()
    , то закрытое поле txt получает значение по умолчанию null
    , и мы можем использовать свойство чтобы присвоить значение).
    Для сравнения мы отображаем значение текстового поля посимволь- но. Для этого используем оператор цикла, в котором каждый символ считывается индексированием экземпляра структуры (инструкция вида A[k]), а размер текста определяется с помощью целочисленного свойства (инструкция A.length).
    Перечисления и структуры
    155
    Командами A[0]=
    ƍaƍ и A[A.length-1]=ƍAƍ меняются значения начального и последнего символов в текстовом поле, после чего результат проверяется с помощью команды Экземпляр структуры как аргумент метода

    Какая встреча И какая неприятная!
    из к/ф «Айболит-66»
    Экземпляр структуры можно передавать методу в качестве агумента. В этом случае важно помнить, что по умолчанию аргументы передаются по значению (то есть в действительности передается копия переменной, фактически указанной аргументом, а структура является типом данных с прямым доступом к значению. В остальном передача экземпляров структуры методу в качестве аргументов достаточно тривиальна. В листинге представлена программа, поясняющая ситуацию.
    
    Листинг 3.7. Экземпляр структуры как аргумент метода System;
    //
    ɋɬɪɭɤɬɭɪɚ:
    struct MyStruct{
    //
    ɋɫɵɥɤɚ ɧɚ ɫɢɦɜɨɥɶɧɵɣ ɦɚɫɫɢɜ:
    public char[] name;
    //
    ɐɟɥɨɱɢɫɥɟɧɧɨɟ ɩɨɥɟ:
    public int code;
    //
    Ʉɨɧɫɬɪɭɤɬɨɪ:
    public MyStruct(string t,int n){
    //
    ɋɨɡɞɚɧɢɟ ɧɚ ɨɫɧɨɜɟ ɬɟɤɫɬɚ ɫɢɦɜɨɥɶɧɨɝɨ ɦɚɫɫɢɜɚ.
    //
    ɋɫɵɥɤɚ ɧɚ ɦɚɫɫɢɜ ɩɪɢɫɜɚɢɜɚɟɬɫɹ ɡɧɚɱɟɧɢɟɦ ɩɨɥɸ:
    name=t.ToCharArray();
    //
    Ɂɧɚɱɟɧɢɟ ɰɟɥɨɱɢɫɥɟɧɧɨɝɨ ɩɨɥɹ:
    code=n;
    }
    }
    Глава 3
    156
    //
    Ʉɥɚɫɫ ɫ ɝɥɚɜɧɵɦ ɦɟɬɨɞɨɦ:
    class StructAsArgDemo{
    //
    Ɇɟɬɨɞ ɞɥɹ ɨɬɨɛɪɚɠɟɧɢɹ ɡɧɚɱɟɧɢɣ ɩɨɥɟɣ ɷɤɡɟɦɩɥɹɪɚ
    //
    ɫɬɪɭɤɬɭɪɵ, ɩɟɪɟɞɚɧɧɨɝɨ ɚɪɝɭɦɟɧɬɨɦ:
    static void show(MyStruct A){
    //
    ɉɪɟɨɛɪɚɡɨɜɚɧɢɟ ɫɢɦɜɨɥɶɧɨɝɨ ɦɚɫɫɢɜɚ ɜ ɬɟɤɫɬ:
    string txt=new string(A.name);
    //
    Ɉɬɨɛɪɚɠɟɧɢɟ ɬɟɤɫɬɚ:
    Console.WriteLine(
    Ǝɋɢɦɜɨɥɶɧɵɣ ɦɚɫɫɢɜ [{0}]Ǝ,txt);
    //
    Ɉɬɨɛɪɚɠɟɧɢɟ ɡɧɚɱɟɧɢɹ ɰɟɥɨɱɢɫɥɟɧɧɨɝɨ ɩɨɥɹ:
    Console.WriteLine(
    Ǝɑɢɫɥɨɜɨɟ ɩɨɥɟ {0}Ǝ,A.code);
    }
    //
    Ɇɟɬɨɞ ɞɥɹ ɩɪɢɫɜɚɢɜɚɧɢɹ ɧɨɜɵɯ ɡɧɚɱɟɧɢɣ ɩɨɥɹɦ
    //
    ɷɤɡɟɦɩɥɹɪɨɜ ɫɬɪɭɤɬɭɪɵ:
    static void maker(MyStruct A,ref MyStruct B,int k,char s){
    Console.WriteLine(
    Ǝȼɵɩɨɥɧɹɟɬɫɹ ɦɟɬɨɞ maker()Ǝ);
    Console.WriteLine(
    Ǝɉɟɪɜɵɣ ɚɪɝɭɦɟɧɬ:Ǝ);
    //
    Ɉɬɨɛɪɚɠɟɧɢɟ ɡɧɚɱɟɧɢɣ ɩɨɥɟɣ ɷɤɡɟɦɩɥɹɪɚ ɫɬɪɭɤɬɭɪɵ:
    show(A);
    Console.WriteLine(
    Ǝȼɬɨɪɨɣ ɚɪɝɭɦɟɧɬ:Ǝ);
    //
    Ɉɬɨɛɪɚɠɟɧɢɟ ɡɧɚɱɟɧɢɣ ɩɨɥɟɣ ɷɤɡɟɦɩɥɹɪɚ ɫɬɪɭɤɬɭɪɵ:
    show(B);
    //
    ɂɡɦɟɧɟɧɢɟ ɡɧɚɱɟɧɢɹ ɷɥɟɦɟɧɬɚ ɜ ɦɚɫɫɢɜɟ:
    A.name[k]=s;
    B.name[k]=s;
    //
    ɂɡɦɟɧɟɧɢɟ ɡɧɚɱɟɧɢɹ ɬɟɤɫɬɨɜɨɝɨ ɩɨɥɹ:
    A.code++;
    B.code++;
    Console.WriteLine();
    Console.WriteLine(
    Ǝɉɟɪɜɵɣ ɚɪɝɭɦɟɧɬ:Ǝ);
    //
    Ɉɬɨɛɪɚɠɟɧɢɟ ɡɧɚɱɟɧɢɣ ɩɨɥɟɣ ɷɤɡɟɦɩɥɹɪɚ ɫɬɪɭɤɬɭɪɵ:
    show(A);
    Перечисления и структуры Console.WriteLine(
    Ǝȼɬɨɪɨɣ ɚɪɝɭɦɟɧɬ:Ǝ);
    //
    Ɉɬɨɛɪɚɠɟɧɢɟ ɡɧɚɱɟɧɢɣ ɩɨɥɟɣ ɷɤɡɟɦɩɥɹɪɚ ɫɬɪɭɤɬɭɪɵ:
    show(B);
    Console.WriteLine(
    ƎɆɟɬɨɞ maker() ɡɚɜɟɪɲɟɧ\nƎ);
    }
    //
    Ƚɥɚɜɧɵɣ ɦɟɬɨɞ:
    static void Main(){
    //
    ɋɨɡɞɚɧɢɟ ɷɤɡɟɦɩɥɹɪɨɜ ɫɬɪɭɤɬɭɪɵ:
    MyStruct A=new MyStruct(
    ƎAlphaƎ,100);
    MyStruct B=new MyStruct(
    ƎBravoƎ,200);
    //
    ȼɵɡɨɜ ɫɬɚɬɢɱɟɫɤɨɝɨ ɦɟɬɨɞɚ:
    maker(A,ref B,4,'R');
    Console.WriteLine(
    Ǝɉɨɫɥɟ ɜɵɡɨɜɚ ɦɟɬɨɞɚ maker()Ǝ);
    Console.WriteLine(
    Ǝɗɤɡɟɦɩɥɹɪ A:Ǝ);
    //
    Ɉɬɨɛɪɚɠɟɧɢɟ ɡɧɚɱɟɧɢɣ ɩɨɥɟɣ ɷɤɡɟɦɩɥɹɪɚ ɫɬɪɭɤɬɭɪɵ:
    show(A);
    Console.WriteLine(
    Ǝɗɤɡɟɦɩɥɹɪ B:Ǝ);
    //
    Ɉɬɨɛɪɚɠɟɧɢɟ ɡɧɚɱɟɧɢɣ ɩɨɥɟɣ ɷɤɡɟɦɩɥɹɪɚ ɫɬɪɭɤɬɭɪɵ:
    show(B);
    Результат выполнения программы такой:
    
    Результат выполнения программы (из листинга 3.7)
    ȼɵɩɨɥɧɹɟɬɫɹ ɦɟɬɨɞ maker()
    ɉɟɪɜɵɣ ɚɪɝɭɦɟɧɬ:
    ɋɢɦɜɨɥɶɧɵɣ ɦɚɫɫɢɜ [Alpha]
    ɑɢɫɥɨɜɨɟ ɩɨɥɟ 100
    ȼɬɨɪɨɣ ɚɪɝɭɦɟɧɬ:
    ɋɢɦɜɨɥɶɧɵɣ ɦɚɫɫɢɜ [Bravo]
    ɑɢɫɥɨɜɨɟ ɩɨɥɟ 200
    Глава 3
    158
    ɉɟɪɜɵɣ ɚɪɝɭɦɟɧɬ:
    ɋɢɦɜɨɥɶɧɵɣ ɦɚɫɫɢɜ [AlphR]
    ɑɢɫɥɨɜɨɟ ɩɨɥɟ 101
    ȼɬɨɪɨɣ ɚɪɝɭɦɟɧɬ:
    ɋɢɦɜɨɥɶɧɵɣ ɦɚɫɫɢɜ [BravR]
    ɑɢɫɥɨɜɨɟ ɩɨɥɟ 201
    Ɇɟɬɨɞ maker() ɡɚɜɟɪɲɟɧ
    ɉɨɫɥɟ ɜɵɡɨɜɚ ɦɟɬɨɞɚ maker()
    ɗɤɡɟɦɩɥɹɪ A:
    ɋɢɦɜɨɥɶɧɵɣ ɦɚɫɫɢɜ [AlphR]
    ɑɢɫɥɨɜɨɟ ɩɨɥɟ 100
    ɗɤɡɟɦɩɥɹɪ B:
    ɋɢɦɜɨɥɶɧɵɣ ɦɚɫɫɢɜ [BravR]
    ɑɢɫɥɨɜɨɟ ɩɨɥɟ У структуры MyStruct есть открытое целочисленное поле code и открытое поле name, представляющее собой ссылку на символьный массив. Конструктор имеет два аргумента текстовый и целочисленный. Целочисленный аргумент присваивается в качестве значения полю code. Текстовый аргумент (обозначен как t) командой t.ToCharArray() преобразуется в символьный массив (точнее, на основе текста формируется массива ссылка на массив записывается в поле В классе с методом Main() описано два статических метода. Метод show()
    не возвращает результата аргументом методу передается экземпляр структуры MyStruct. Метод предназначен для отображения значений полей экземпляра структуры, переданного методу в качестве аргумента. В теле метода командой string txt=new string(A.name) на основе символьного массива name экземпляра A (аргумент метода) создается текстовое значение, и ссылка на текстовый объект записывается в переменную txt. Значение этой текстовой переменной отображается в консольном окне. Также в консольном окне отображается значение целочисленного поля code экземпляра Еще один статический метод maker() также не возвращает результат. У метода четыре аргумента. Первые два являются экземплярами
    Перечисления и структуры
    159
    структуры MyStruct, причем первый аргумент (обозначен как A) передается по значению, а второй аргумент (обозначен как B и описан с ключевым словом ref) передается по ссылке. Третий аргумент (обозначен как k) является целым числом, а четвертый аргумент (обозначен как s) является символьным значением. Метод выполняется так сначала отображаются значения полей экземпляров A и B структуры команды show(A) и show(B)), переданных методу в качестве аргументов, после этого изменяются значения полей этих экземпляров, и новые значения полей отображаются в консольном окне (еще раз используются команды show(A) и show(B)). Изменение полей выполняется следующим образом. Символьное значение s, переданное четвертым аргументом, присваивается элементу с индексом k (третий аргумент метода) массива name экземпляров структуры команды и B.name[k]=s). Еще командами A.code++ и B.code++ на единицу увеличивается значение поля code экземпляров структуры.
    В главном методе программы командами MyStruct A=new MyStruct
    (
    ƎAlphaƎ,100) и MyStruct B=new MyStruct(ƎBravoƎ,200) создаются два экземпляра структуры. После этого выполняется команда maker(A,ref
    B,4,
    ƍRƍ). Экземпляр A передается методу по значению, то есть передается копия экземпляра A. Экземпляр B передается по ссылке, то есть в оригинале. Что происходит Сначала отображаются значения полей для копии экземпляра A и экземпляра B. С оригиналом все просто. С копией ситуация такая. Поле code у копии экземпляра имеет такое же значение, что и поле code оригинала. Поле name копии имеет такое же значение, как и поле name оригинала. Значение этого поля — ссылка на массив. Получается, что и экземпляр A, и его копия, переданная в метод maker() через поле name, ссылаются на один и тот же массив. Поэтому при выполнении метода maker() меняется значение поля code копии экземпляра A, а также меняется значение элемента в массиве, на который ссылаются поля name и экземпляра A, и его копии (переданной в качестве аргумента. Что касается экземпляра B, то, поскольку он передается по ссылке, все изменения происходят именно с этим экземпляром.
    После завершения работы метода maker() мы проверяем значения полей экземпляров A и B. Видим, что у экземпляра B изменилось и значение поля code, и значение символа в символьном массиве. У экземпляра
    A
    изменилось только значение элемента в символьном массиве (в силу описанных выше причин
    Глава Экземпляр структуры как результат метода
    Погубят тебя слишком большие возможности.
    из к/ф «Айболит-66»
    Экземпляр структуры может возвращаться результатом метода. Небольшая программа, в которой есть метод, возвращающий результатом экземпляр структуры, представлена в листинге Листинг 3.8. Экземпляр структуры как аргумент метода System;
    //
    ɋɬɪɭɤɬɭɪɚ:
    struct MyStruct{
    //
    ɋɫɵɥɤɚ ɧɚ ɫɢɦɜɨɥɶɧɵɣ ɦɚɫɫɢɜ:
    public char[] name;
    //
    ɐɟɥɨɱɢɫɥɟɧɧɨɟ ɩɨɥɟ:
    public int code;
    //
    Ʉɨɧɫɬɪɭɤɬɨɪ:
    public MyStruct(char[] s,int n){
    //
    Ɂɧɚɱɟɧɢɹ ɩɨɥɟɣ:
    name=s;
    code=n;
    }
    //
    Ɇɟɬɨɞ ɞɥɹ ɨɬɨɛɪɚɠɟɧɢɹ ɡɧɚɱɟɧɢɣ ɩɨɥɟɣ:
    public void show(){
    Console.Write(
    ƎɆɚɫɫɢɜ: Ǝ);
    for(int k=0;k Console.Write(
    Ǝ|Ǝ+name[k]);
    }
    Console.WriteLine(
    Ǝ|\nɑɢɫɥɨɜɨɟ ɩɨɥɟ: {0}Ǝ,code);
    }
    }
    //
    Ʉɥɚɫɫ ɫ ɝɥɚɜɧɵɦ ɦɟɬɨɞɨɦ:
    Перечисления и структуры StructAsResultDemo{
    //
    Ɇɟɬɨɞ ɜɨɡɜɪɚɳɚɟɬ ɪɟɡɭɥɶɬɚɬɨɦ ɷɤɡɟɦɩɥɹɪ ɫɬɪɭɤɬɭɪɵ:
    static MyStruct create(string t,int n){
    //
    ɋɨɡɞɚɧɢɟ ɫɢɦɜɨɥɶɧɨɝɨ ɦɚɫɫɢɜɚ ɧɚ ɨɫɧɨɜɟ ɬɟɤɫɬɚ:
    char[] s=t.ToCharArray();
    //
    ɋɨɡɞɚɧɢɟ ɷɤɡɟɦɩɥɹɪɚ ɫɬɪɭɤɬɭɪɵ:
    MyStruct R=new MyStruct(s,n);
    //
    Ɋɟɡɭɥɶɬɚɬ ɦɟɬɨɞɚ:
    return R;
    }
    //
    Ƚɥɚɜɧɵɣ ɦɟɬɨɞ:
    static void Main(){
    //
    ɗɤɡɟɦɩɥɹɪ ɫɬɪɭɤɬɭɪɵ:
    MyStruct A;
    //
    ɉɪɢɫɜɚɢɜɚɧɢɟ ɡɧɚɱɟɧɢɹ ɷɤɡɟɦɩɥɹɪɭ:
    A=create(
    ƎAlphaƎ,100);
    //
    ɉɪɨɜɟɪɤɚ ɡɧɚɱɟɧɢɣ ɩɨɥɟɣ:
    A.show();
    //
    ȼɵɡɨɜ ɦɟɬɨɞɚ ɢɡ ɪɟɡɭɥɶɬɚɬɚ ɜɵɡɨɜɚ ɦɟɬɨɞɚ:
    create(
    ƎBravoƎ,200).show();
    Результат выполнения программы будет следующим:
    
    1   ...   8   9   10   11   12   13   14   15   ...   40


    написать администратору сайта