Главная страница Библиотека (скачать книги) Скачать софт Введение в программирование Стандарты для C++ Уроки по C# Уроки по Python HTML Веб-дизайн Ассемблер в среде Windows ActiveX Javascript Общее о Линукс Линукс - подробно Линукс - новое Delphi Паскаль для начинающих Турбопаскаль Новости Партнеры Наши предложения Архив новостей |
Классы-коллекции.
Вам уже известен класс для хранения набора элементов в C# - это массив System.Array.
В нем достаточно много полезных методов, выполняющих различные действия. Например, сортировка массива. Однако класс – массив не является единственным встроенным классом, который используется для решения часто встречающихся проблем. ArrayList - используется для массивовов с часто изменяющимся размером. Реализует интерфейсы IList,ICollection,IEnumerable,ICloneable. Stack - самый обычный стек.Реализует ICollection,IEnumerable. Queue - стандартная очередь (FIFO - первым пришел,первым ушел).Реализует интерфейсы IList,ICollection,IEnumerable,ICloneable. Сверху были приведены лишь часть классов пространства System.Collections остальные можно посмотреть в MSDN. Общий принцип работы классов-коллекций схож. Поэтому, рассмотрим пример на взаимодействие с классом-коллекцией ArrayList. using System; using System.Collections; class Man { public string name; public string surname; public Man(string name,string surname){ this.name=name; this.surname=surname; } public void Show(){ Console.WriteLine("Имя={0} Фамилия={1}",name,surname); } } class Sample { static void Main() { try { ArrayList ar = new ArrayList(); ar.Add(new Man("Вася","Петров")); // добавление элемента ar.Add(new Man("1","2")); foreach(Man b in ar){ b.Show(); } Console.WriteLine("\n\n"); ar.RemoveAt(0);// удаление элемента foreach(Man b in ar){ b.Show(); } } catch(Exception ex) { Console.WriteLine(ex.Message); } Console.Read(); } } Свойства.Свойства - это именованные члены классов, структур и интерфейсов, которые предоставляют гибкий механизм для чтения, записи и вычисления значений закрытых (преимущественно) полей с помощью функций доступа (accessors).
В C# свойства реализованы на уровне синтаксиса языка. Для пользователя свойства выглядят как переменные класса, однако чтение и изменение их значений выполняется функциями класса. Функции доступаПри объявлении свойства необходимоуказать один или два блока программного кода, которые называются функциями доступа (accessors). Функции доступа читают и/или задают новое значение свойства. class SomeClass { // Поле int size; // Свойство public int Size { // Функция чтения get { return size; } // Функция записи set { // value - специальный переменная, // которая содержит присваиваемую величину; // тип value совпадает с типом свойства size = value; } } } class Test { static void Main() { SomeClass sc = new SomeClass(); Console.WriteLine(sc.Size); // функция get sc.Size = 100; // функция set Console.WriteLine(sc.Size); // функция get } } ОграниченияФункция get обязана вернуть значение или инициировать исключение, внутри функции set запрещено использовать локальную переменную с именем value. Свойства и наследованиеСвойства, как и функции класса, могут объявляться с модификаторами virtual, override и abstract. Модификатор включается в объявление свойства и распространяется на обе функции доступа. При объявлении в производном классе свойства с тем же именем, что и в базовом классе, свойство базового класса скрывается полностью. Пример полиморфного свойства class SomeClass { // Поле string name; // Свойство virtual public string Name { // Функция чтения get { return name != null ? name : "Not avaiable"; } // Функция записи set { name = value; } } } class SomeClassD : SomeClass { // Поле string name; // Свойство override public string Name { // Функция чтения get { return name != null ? name : "Not avaiable yet"; } // Функция записи set { name = value.ToUpper(); } } } class Test { static void Main() { SomeClass sc1 = new SomeClass(); SomeClass sc2 = new SomeClassD(); Console.WriteLine("sc1: {0}", sc1.Name); Console.WriteLine("sc2: {0}", sc2.Name); sc1.Name = "Hello"; sc2.Name = "Hello"; Console.WriteLine("sc1: {0}", sc1.Name); Console.WriteLine("sc2: {0}", sc2.Name); } } Пример объявления свойств в интерфейсахusing System; interface ISome { string Name { get; set; } } class SomeClass : ISome { // Поле string name; // Свойство virtual public string Name { // Функция чтения get { return name != null ? name : "Not avaiable"; } // Функция записи set { name = value; } } } class SomeClassD : SomeClass { // Поле string name; // Свойство override public string Name { // Функция чтения get { return name != null ? name : "Not avaiable yet"; } // Функция записи set { name = value.ToUpper(); } } } class Test { static void Main() { ISome i1 = new SomeClass(); ISome i2 = new SomeClassD(); Console.WriteLine("SomeClass: {0}", i1.Name); Console.WriteLine("SomeClassD: {0}", i2.Name); i1.Name = "Hello"; i2.Name = "Hello"; Console.WriteLine("SomeClass: {0}", i1.Name); Console.WriteLine("SomeClassD: {0}", i2.Name); } } ***** Тело функции доступа в свойстве, объвленном в интерфейсе, не должно иметь тела. ***** Статические свойстваC# позволяет определять также статические свойства, которые принадлежат классу в целом, а не его отдельным экземплярам. Статические свойства не могут быть объявлены с модификаторами virtual, override или abstract. class SomeClass { static int count = 0; static public int Count { get { return count; } } public SomeClass() { ++count; } } class Test { static void Main() { Console.WriteLine("Count = {0}", SomeClass.Count); // 0 SomeClass s = new SomeClass(); Console.WriteLine("Count = {0}", SomeClass.Count); // 1 } } ***** Свойства не являются переменными. Нельзя передать свойство в функцию как ref или out параметр. ***** Более подробную информацию можно получить, изучив практические примеры, или заглянув в MSDN. |
|
Библиотека программиста. 2009. |
|