Шаг 124.
Язык программирования C#. Начала
Свойства и индексаторы. Использование свойств (еще продолжение)

    На этом шаге мы рассмотрим пример использования только set-аксессора.

    Более экзотическим является случай, когда свойство доступно для присваивания значения, но не доступно для его считывания. Тем не менее такое тоже возможно. Соответствующее свойство описывается с set-аксессором, но без get-аксессора. Соответствующий пример представлен ниже.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace pr124_1
{
    // Класс со свойством: 
    class MyClass {
        // Закрытое текстовое поле: 
        private string code;
        // Конструктор с одним аргументом: 
        public MyClass(uint n) {
            // Присваивание значения свойству: 
            number = n;
        }

        // Переопределение метода ToString(): 
        public override string ToString() { 
            return code; // Результат метода
        }

        // Свойство без get-аксессора: 
        public uint number {
            // Метод вызывается при присваивании
            // значения свойству:
            set {
                // Локальная переменная: 
                uint num = value;
                // Начальное значение текстового поля: 
                code = "";
                // Вычисление битов числа: 
                do {
                    // Значение последнего (младшего) бита 
                    // дописывается слева к тексту: 
                    code = (num % 2) + code;
                    // Сдвиг кода числа на одну позицию вправо: 
                    num >>= 1;
                } while(num != 0);
            }
        }
    }

    // Класс с главным методом:
    class Program
    {
        // Главный метод:
        static void Main()
        {
            // Создание объекта:
            MyClass obj = new MyClass(5);
            // Бинарный код целого числа:
            Console.WriteLine("Бинарный код числа 5:\t" + obj); 
            // Присваивание значения свойству: 
            obj.number = 45;
            // Бинарный код целого числа:
            Console.WriteLine("Бинарный код числа 45:\t" + obj);
            // Задержка:
            Console.ReadLine();
        }
    }
}
Архив проекта можно взять здесь.

    Ниже приведен результат данной программы.


Рис.1. Результат выполнения программы

    В данном случае мы имеем дело с классом MyClass, у которого есть свойство number типа uint (неотрицательное целое число) и закрытое текстовое поле code. Свойству можно присвоить значение, но нельзя прочитать значение свойства. При присваивании значения свойству number в текстовое поле code записывается (в виде текстовой строки) бинарный код этого числа. Метод ToString() переопределен в классе так, что результатом метода возвращается значение текстового поля code. Конструктору передается аргументом целое неотрицательное число, которое присваивается значением свойству number.

    В set-аксессоре свойства number присваиваемое свойству значение записывается в локальную переменную num командой

  uint num = value;    .
Текстовое поле code получает начальным значением пустой текст командой
  code = "";      .
После этого запускается конструкция цикла do. В теле цикла командой
  code = (num % 2) + code;
к текущему текстовому значению поля code слева дописывается значение последнего бита в числовом значении num. Для вычисления последнего (младшего) бита в числе (значение переменой num) мы вычисляем остаток от деления этого числа на 2 (выражение num%2). Остаток от деления на 2 - это число 0 или 1. После того как значение младшего (на данный момент) бита записано, командой
  num >>= 1;
бинарный код числового значения переменной num сдвигается вправо на одну позицию. Младший бит теряется, а новым младшим битом становится тот, который был до этого предпоследним. На следующей итерации этот бит будет прочитан и дописан к текстовому значению поля code. Так будет продолжаться до тех пор, пока значение переменной num отлично от нуля (условие num!=0 в инструкции while).


В set-аксессоре поле code получает начальное значение "". Если свойству number присваивается значение 0, то конструкция цикла do-while будет выполнена один раз, и в результате текстовое поле code получит значение "0".

    В главном методе мы создаем объект с передачей значения 5 аргументом конструктору и в итоге получаем бинарный код для этого числа. Затем свойству number присваивается новое значение 45, а в результате приведения объекта к текстовому формату в консоли появляется его бинарный код.

    На следующем шаге мы продолжим изучение этого вопроса.




Предыдущий шаг Содержание Следующий шаг