varl = var2 + var3 *
var4;
В этом выражении сначала будет выполнен оператор *, затем оператор + и последним – оператор =. Это принятый в математике стандартный порядок выполнения операций, он приведет к получению того же самого результата, который можно ожидать при выполнении аналогичных арифметических вычислений на бумаге. Можно также управлять порядком выполнения операторов с помощью скобок, например: varl = (var2 + var3) * var4;
В данном случае в первую очередь будет выполняться то, что содержится в скобках, то есть оператор + будет выполнен перед оператором *.
Для всех рассматриваемых операторов порядок выполнения показан ниже; при этом операторы с одинаковым старшинством (такие как * и /) выполняются в порядке своего следования слева направо.
Таблица 1.9 – Старшинство операторов
Старшинство | Операторы |
Высшее | ++,--(используемые в качестве префиксов) , +, -(унарные) *, /, %, =, *=, /=, %=, +=,-= |
Низшее | ++,--(используемые в качестве суффиксов) |
Для изменения порядка выполнения операторов используются скобки, как говорилось выше.
1.4.Пространства имен
Пространства имен - это способ, используемый в .NET, который позволяет создавать контейнеры для кода приложений, чтобы и код, и его составные части были однозначно идентифицированы.
Пространства имен используются также в качестве средства категоризации объектов в .NET Framework. Большинство таких объектов представляют собой определения типов, например, определения простых типов.
Код С# по умолчанию содержится в глобальном пространстве имен. Это означает, что к объектам в коде С# можно обратиться из любого другого кода в глобальном пространстве имен просто по их имени. Можно воспользоваться ключевым словом namespace для того, чтобы явно задать пространство имен для любого блока кода, заключенного в фигурные скобки. Имена, находящиеся в таком пространстве имен, если к ним обращаются не из данного пространства имен, должны квалифицироваться.
Квалифицированным именем называется имя, в котором содержится вся информация касательно его иерархии. Это означает, что если имеется код, находящийся в одном пространстве имен, и необходимо воспользоваться именем, определенным в другом пространстве имен, то следует использовать ссылку на это пространство имен. В квалифицированных именах для разделения уровней пространств имен используется символ точки. Например:
namespace LevelOne {
// программа, находящаяся в пространстве имен LevelOne//в ней описывается имя "NameOne"
}
// программа, находящаяся в глобальном пространстве имен
В этой программе описывается единственное пространство имен – LevelOne. В данном случае в программе не содержится никакого исполняемого кода. Это сделано для того, чтобы придать обсуждению максимально общий характер; напротив, в код помещен комментарий, в котором содержится это описание. Код, содержащийся внутри пространства имен LevelOne, может просто ссылаться на имя NameOne, и никакой классификации не требуется. Однако в коде, находящемся в глобальном пространстве имен, необходимо использовать классифицированное имя LevelOne. NameOne для того, чтобы на него сослаться.
Внутри любого пространства имен можно описывать вложенные пространства имен, используя то же самое ключевое слово namespace. При обращению к вложенным пространствам имен следует указывать всю их иерархию, отделяя один уровень иерархии от другого с помощью точки. Рассмотрим следующие пространства имен:
namespace LevelOne {
// программа, находящаяся в пространстве имен LevelOne namespace LevelTwo {// программа, находящаяся в пространстве имен LevelOne.LevelTwo
//в ней описывается имя "NameTwo" }
}
// программа, находящаяся в глобальном пространстве имен
В данном случае обращение к имени NameTwo из глобального пространства имен должно иметь вид LevelOne.LevelTwo.NameTwo, из пространства имен LevelOne – LevelTwo.NameTwo, а из пространства имен LevelOne.LevelTwo – NameTwo.
Имена идентифицируются пространствами имен уникальным образом. Можно описать одно и то же имя NameThree как в пространстве имен LevelOne, так и в пространстве имен LevelTwo:
namespace LevelOne {
// здесь описывается имя "NameThree" namespace LevelTwo {// здесь описывается имя "NameThree" }
}
В данном случае описаны два разных имени, которые могут использоваться независимо друг от друга LevelOne.NameThree и LevelOne.LevelTwo.NameThree.
После того, как пространство имен определено, появляется возможность использовать оператор using для упрощения доступа к содержащимся в нем именам. Оператор using как бы говорит: "Да, нам действительно понадобится доступ к именам из данного пространства имен, поэтому не заставляйте меня классифицировать их каждый раз". Например, в следующей программе предполагается, что код, находящийся в пространстве имен LevelOne, должен иметь доступ к именам пространства имен LevelOne.LevelTwo без какой бы то ни было классификации:
namespace LevelOne
{ using LevelTwo; namespace LevelTwo {// здесь описывается имя "NameTwo"
}
}
Код, находящийся в пространстве имен LevelOne, теперь может обращаться к LevelTwo.NameTwo просто как к NameTwo.
Бывают случаи, как в примере с NameThree, когда такой подход может приводить к конфликту между именами, находящимися в различных пространствах имен (при этом код, скорее всего, компилироваться не будет). В подобных случаях можно задать для пространства имен подставное имя (alias) в операторе using:
namespace LevelOne { | ||
using LT = LevelTwo; | ||
// здесь описывается имя "NameThree" | ||
namespace LevelTwo { | ||
// здесь описывается имя "NameThree" } } |
Тогда в пространстве имен LevelOne мы сможем обращаться к LevelOne.NameThree просто как к NameThree, а к LevelOne.LevelTwo.NameThree как к LT.NameThree.
Операторы using оказывают влияние на то пространство имен, в котором они находятся, а также на все вложенные пространства имен, которые могут содержаться в данном пространстве имен. В вышеприведенном коде в глобальном пространстве имен использовать LT.NameThree нельзя. Однако если оператор using расположить следующим образом:
using LT = LevelOne.LevelTwo; namespace LevelOne {
// здесь описывается имя "NameThree namespace LevelTwo{
// здесь описывается имя 'NameThree'
}
} то использовать имя LT.NameThree можно будет и из глобального пространства имен, и из пространства имен LevelOne.
Оператор using сам по себе не обеспечивает доступа к именам, находящимся в других пространствах имен. До тех пор, пока код из пространства имен не будет каким-либо способом привязан к проекту (например, описан в исходном файле проекта или описан в каком-либо коде), привязанному к этому проекту, получить доступ к содержащимся в нем именам будет невозможно. Более того, если код, в котором содержится некое пространство имен, привязан к проекту, то имеется доступ к содержащимся в нем именам независимо от использования оператора using. Оператор using всего лишь упрощает обращение к этим именам и позволяет сократить сильно удлиняющийся в противном случае код, делая его более понятным.
Вернувшись к программе Console Application (рис.1) можно обнаружить там следующие строки кода, относящиеся к пространствам имен:
using System;
namespace ConsoleApplication { }В первой строке располагается оператор using, в котором объявляется, что пространство имен System будет использоваться во всей программе С# и доступ к нему из любых пространств имен данного файла должен осуществляться без использования классификации. Пространство имен System является корневым пространством имен в .NET Framework и включает все основные функциональные возможности, для консольных приложений.
1.5. Вопросы для повторения
1. Что такое атомарные переменные?
2. Перечислите основные типы переменных, используемых в C#.
3. Приведите общий вид программы консольного приложения.
4. Какие правила используются при именовании переменных?
5. Что такое пространства имен?