-
Как использовать набор C# и получить
Язык C# имеет две функции — функцию присваивания (get) и функцию значения (set), что хорошо видно из генерируемого им промежуточного языкового кода. C# не рекомендует устанавливать общедоступный уровень защиты домена и разрешать пользователям произвольно работать за пределами класса — это слишком неOO, а точнее, слишком небезопасно! Для всех полей, которые должны быть видны за пределами класса, C# рекомендует использовать атрибуты для их выражения. Атрибуты не представляют места хранения, что является фундаментальным различием между атрибутами и доменами. Ниже приведен типичный дизайн атрибута:
использование системы;
классМойКласс
{
целое целое число;
public int целое число
{
получить {возвратить целое число;}
установить {целое число=значение;}
}
}
классный тест
{
общественная статическая пустота Main()
{
MyClass MyObject = новый MyClass();
Console.Write(MyObject.Integer);
МойОбъект.Целое++;
Console.Write(MyObject.Integer);
}
}
Как и ожидалось, программа выводит 0 1. Мы видим, что атрибуты предоставляют программистам удобный интерфейс доступа к членам домена посредством методов-оберток. Значением здесь является ключевое слово C#, которое является неявным параметром set при выполнении операций с атрибутами, то есть rvalue при выполнении операций записи атрибутов.
Атрибуты обеспечивают три операции интерфейса: только чтение (получение), только запись (установка) и чтение-запись (получение и установка). Эти три операции в домене должны быть объявлены под одним и тем же именем атрибута и не могут быть разделены. См. следующую реализацию.
классМойКласс
{
имя частной строки;
общедоступная строка Имя
{
получить {возвратить имя}
}
общедоступная строка Имя
{
установить {имя = значение}
}
}
Вышеупомянутый метод разделения реализации атрибута Name неверен! Нам нужно соединить их вместе, как в предыдущем примере. Стоит отметить, что в C# три свойства (только для чтения, только для записи, для чтения и записи) считаются одним и тем же именем свойства, см. следующий пример:
классМойКласс
{
защищенное целое число = 0;
public int Num
{
набор
{
число = значение;
}
}
}
класс MyClassDerived: MyClass
{
новый public int Num
{
получать
{
вернуть число;
}
}
}
классный тест
{
общественная статическая пустота Main()
{
MyClassDerived MyObject = новый MyClassDerived();
//МойОбъект.Num= 1 //Ошибка!
((MyClass)MyObject).Num = 1;
}
}
Мы видим, что атрибут Num-get{} в MyClassDerived блокирует определение атрибута Num-set{} в MyClass.
Конечно, атрибуты — это гораздо больше, чем просто операции интерфейса домена. Сущность атрибутов по-прежнему заключается в методах. Мы можем выполнять определенные проверки, предупреждения и другие дополнительные операции на основе логики программы при извлечении или назначении атрибутов. См. следующий пример.
классМойКласс
{
имя частной строки;
общедоступная строка Имя
{
получить {возвратить имя}
набор
{
если (значение==ноль)
name="Майкрософт";
еще
имя = значение;
}
}
}
Из-за природы метода атрибутов, конечно, атрибуты также имеют различные модификации методов. Атрибуты также имеют 5 модификаторов доступа, но модификаторы доступа атрибутов часто являются публичными, иначе мы потеряем смысл атрибутов как публичных интерфейсов классов. Помимо отсутствия атрибутов функций, таких как перегрузка метода, вызванная несколькими параметрами метода, модификаторы, такие как виртуальный, запечатанный, переопределенный и абстрактный, имеют одинаковое поведение для атрибутов и методов, поскольку атрибуты по существу реализованы как два метода. , это Определенное поведение требует нашего внимания. Посмотрите на следующий пример:
абстрактный класс А
{
интервал y;
публичный виртуальный int X
{
получить {вернуть 0;
}
публичный виртуальный int Y
{
получить {вернуть Y;
установить {y = значение}
}
общественная абстрактная ИНТ Z {получить;
}
класс Б: А
{
интервал г;
публичное переопределение int X
{
получить {вернуть базу.X + 1;
}
публичное переопределение int Y
{
установить {base.Y = значение <0? 0: значение};
}
публичное переопределение int Z
{
получить {вернуть z;
установить { г = значение }
}
}
В этом примере демонстрируется типичное поведение свойств в контексте наследования. Здесь класс A должен быть объявлен абстрактным из-за существования абстрактного атрибута Z. Подкласс B относится к атрибутам родительского класса A через ключевое слово base. Класс B может перезаписать виртуальные атрибуты класса A только через Y-набор.
Статические свойства, как и статические методы, могут иметь доступ только к статическим переменным домена класса. Мы также можем объявлять внешние свойства так же, как и внешние методы.