Главная Случайная страница


Полезное:

Как сделать разговор полезным и приятным Как сделать объемную звезду своими руками Как сделать то, что делать не хочется? Как сделать погремушку Как сделать так чтобы женщины сами знакомились с вами Как сделать идею коммерческой Как сделать хорошую растяжку ног? Как сделать наш разум здоровым? Как сделать, чтобы люди обманывали меньше Вопрос 4. Как сделать так, чтобы вас уважали и ценили? Как сделать лучше себе и другим людям Как сделать свидание интересным?


Категории:

АрхитектураАстрономияБиологияГеографияГеологияИнформатикаИскусствоИсторияКулинарияКультураМаркетингМатематикаМедицинаМенеджментОхрана трудаПравоПроизводствоПсихологияРелигияСоциологияСпортТехникаФизикаФилософияХимияЭкологияЭкономикаЭлектроника






Предотвращение конфликтов имен с помощью пространств имен





Главное преимущество пространств имен заключается в том, что объявленные в них имена не вступают в конфликт с именами, объявленными за их пределами. Например, в приведенной ниже программе определяются два пространства имен. Первым из них является представленное ранее пространство имен Counter, а вторым — Counter2. Оба пространства имен содержат классы с одинаковым именем CountDown, но поскольку это разные пространства, то оба класса CountDown не вступают в конфликт друг с другом. Кроме того, оба пространства имен определены в одном и том же файле. Как пояснялось выше, это вполне допустимо. Безусловно, каждое из этих пространств имен можно было бы выделить в отдельный файл, если бы в этом возникла потребность.

// Пространства имен предотвращают конфликты имен.

using System;

// Объявить пространство имен Counter.

namespace Counter

{

// Простой вычитающий счетчик.

class CountDown

{

int val;

public CountDown(int n)

{

val = n;

}

public void Reset(int n)

{

val = n;

}

public int Count()

{

if (val > 0) return val--;

else return 0;

}

}

}

// Объявить пространство имен Counter2.

namespace Counter2

{

/* Этот класс CountDown относится к пространству

имен Counter2 и поэтому не вступает в конфликт

с аналогичным классом из пространства имен Counter.

*/

class CountDown

{

public void Count()

{

Console.WriteLine("Это метод Count() из пространства имен Counter2.");

}

}

}

class NSDemo

{

static void Main()

{

// Это класс CountDown из пространства имен Counter.

Counter.CountDown cd1 = new Counter.CountDown(10);

// Это класс CountDown из пространства имен Counter2.

Counter2.CountDown cd2 = new Counter2.CountDown();

int i;

do

{

i = cd1.Count();

Console.Write(i + " ");

} while (i > 0);

Console.WriteLine();

cd2.Count();

}

}

10 9 8 7 6 5 4 3 2 1 0

Это метод Count() из пространства имен Counter2.

Директива using

Если в программе присутствуют частые ссылки на члены конкретного пространства имен, то указывать это пространство всякий раз, когда требуется ссылка на него, не очень удобно. Преодолеть это затруднение помогает директива using. В подавляющем большинстве приводившихся ранее примеров программ с помощью этой директивы делалось видимым глобальное для C# пространство имен System, поэтомуона отчасти вам уже знакома. Как и следовало ожидать, с помощью директивы using можно сделать видимыми вновь создаваемые пространства имен.

Существуют две формы директивы using. Ниже приведена первая из них:

using имя;

где имя обозначает имя того пространства имен, к которому требуется получить доступ. Все члены, определенные в указанном пространстве имен, становятся видимыми, и поэтому могут быть использованы без дополнительного определения их имен. Директиву using необходимо вводить в самом начале каждого файла исходного кода перед любыми другими объявлениями или же в начале тела пространства имен.

Приведенная ниже программа является вариантом предыдущего примера, переработанным с целью продемонстрировать применение директивы using, делающей видимым создаваемое пространство имен.

// Продемонстрировать применение директивы using.

using System;

// Сделать видимым пространство имен Counter.

using Counter;

// Объявить пространство имен для счетчиков.

namespace Counter

{

// Простой вычитающий счетчик.

class CountDown

{

int val;

public CountDown(int n)

{

val = n;

}

public void Reset(int n)

{

val = n;

}

public int Count()

{

if (val > 0) return val--;

else return 0;

}

}

}

class NSDemo3

{

static void Main()

{

// Теперь класс CountDown может быть использован непосредственно.

CountDown cd1 = new CountDown(10);

int i;

do

{

i = cd1.Count();

Console.Write(i + " ");

} while (i > 0);

Console.WriteLine();

CountDown cd2 = new CountDown(20);

do

{

i = cd2.Count();

Console.Write(i + " ");

} while (i > 0);

Console.WriteLine();

cd2.Reset(4);

do

{

i = cd2.Count();

Console.Write(i + " ");

} while (i > 0);

Console.WriteLine();

}

}

В эту версию программы внесены два существенных изменения. Первое из них состоит в применении директивы using в самом начале программы, как показано ниже.

using Counter;

Благодаря этому становится видимым пространство имен Counter. Второе изменение состоит в том, что класс CountDown больше не нужно дополнительно определять с помощью пространства имен Counter, как демонстрирует приведенная ниже строка кода из метода Main().


CountDown cd1 = new CountDown(10);

Теперь пространство имен Counter становится видимым, и поэтому класс CountDown может быть использован непосредственно.

Вторая форма директивы using

Вторая форма директивы using позволяет определить еще одно имя (так называемый псевдоним) типа данных или пространства имен. Эта форма приведена ниже:

using псевдоним = имя;

где псевдоним становится еще одним именем типа (например, типа класса) или пространства имен, обозначаемого как имя. После того как псевдоним будет создан, он может быть использован вместо первоначального имени.

Ниже приведен вариант программы из предыдущего примера, измененный с целью показать создание и применение псевдонима MyCounter вместо составного имени Counter.CountDown.

// Продемонстрировать применение псевдонима.

using System;

// Создать псевдоним для составного имени Counter.CountDown.

using MyCounter = Counter.CountDown;

// Объявить пространство имен для счетчиков.

namespace Counter

{

// Простой вычитающий счетчик.

class CountDown

{

int val;

public CountDown(int n)

{

val = n;

}

public void Reset(int n)

{

val = n;

}

public int Count()

{

if (val > 0) return val--;

else return 0;

}

}

}

class NSDemo4

{

static void Main()

{

// Здесь и далее псевдоним MyCounter используется

// вместо составного имени Counter.CountDown.

MyCounter cd1 = new MyCounter(10);

int i;

do

{

i = cd1.Count();

Console.Write(i + " ");

} while (i > 0);

Console.WriteLine();

MyCounter cd2 = new MyCounter(20);

do

{

i = cd2.Count();

Console.Write(i + " ");

} while (i > 0);

Console.WriteLine();

cd2.Reset(4);

do

{

i = cd2.Count();

Console.Write(i + " ");

} while (i > 0);

Console.WriteLine();

}

}

Псевдоним MyCounter создается с помощью следующего оператора.

using MyCounter = Counter.CountDown;

После того как псевдоним будет определен в качестве другого имени класса Counter.CountDown, его можно использовать для объявления объектов без дополнительного определения имени данного класса. Например, в следующей строке кода из рассматриваемой здесь программы создается объект класса CountDown.

MyCounter cd2 = new MyCounter(20);







Date: 2015-09-02; view: 377; Нарушение авторских прав



mydocx.ru - 2015-2024 year. (0.012 sec.) Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав - Пожаловаться на публикацию