Главная страница
Библиотека (скачать книги)
Скачать софт
Введение в программирование
Стандарты для C++
Уроки по C#
Уроки по Python
HTML
Веб-дизайн
Ассемблер в среде Windows
ActiveX
Javascript
Общее о Линукс
Линукс - подробно
Линукс - новое
Delphi
Паскаль для начинающих
Турбопаскаль
Новости
Партнеры
Наши предложения
Архив новостей





Классы-коллекции.

Вам уже известен класс для хранения набора элементов в C# - это массив System.Array. В нем достаточно много полезных методов, выполняющих различные действия. Например, сортировка массива. Однако класс – массив не является единственным встроенным классом, который используется для решения часто встречающихся проблем.
Встроенные типы данных определены в пространстве имен System.Collections.Например:

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# свойства реализованы на уровне синтаксиса языка. Для пользователя свойства выглядят как переменные класса, однако чтение и изменение их значений выполняется функциями класса.
Таким образом, пользовательская модель (переменная класса) отделяется от модели реализации (функция класса). Пользователь изолируется от конкретных технических решений, что обеспечивает большую гибкость при выборе архитектуры и сопровождении класса.

В .Net Runtime свойства реализуются при помощи небольшого объема дополнительных метаданных, связывающих функции класса с именами свойств. Благодаря этому в одних языках свойства выглядят как свойства, а в других - как обычные функции класса.

Функции доступа

При объявлении свойства необходимоуказать один или два блока программного кода, которые называются функциями доступа (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.
Администратор: admin@programmer-lib.ru