//определенное присваивание
int аn =0; //переменные должны быть инициализированы
for (int i= 0;i<5;i++)
{an =i + 1; }
x+=an; z+=an; у = an;
string[] ars = new string[3];
doublet] ard = new double[3];
for (int i= 0;i<3;i++)
{
//массивы могут быть без инициализации
ard[i] += i+1;
ars[i] += i.ToString()+1;
Console.WriteLine("ard[" +i + "]=" +ard[i] + "; ars[" +i + "]=" +ars[i]);
}
Заметьте, в этом фрагменте переменная аn обязана быть инициализированной, а массивы ard и ars не инициализируются и спокойно участвуют в вычислениях.
Еще раз о семантике присваивания
Подводя итоги рассмотрения присваивания х=е, следует отметить, что семантика присваивания далеко не столь проста, как может показаться с первого взгляда. Напомню, что деление типов на значимые и ссылочные приводит к двум семантикам присваивания. Будет ли семантика значимой или ссылочной — определяется типом левой части присваивания. Переменные значимых типов являются единоличными владельцами памяти, в которой хранятся их значения. При значимом присваивании память для хранения значений остается той же — меняются лишь сами значения, хранимые в ней. Переменные ссылочных типов (объекты) являются ссылками на реальные объекты динамической памяти. Ссылки могут разделять одну и ту же область памяти — ссылаться на один и тот же объект. Ссылочное присваивание — это операция над ссылками. В результате ссылочного присваивания ссылка начинает указывать на другой объект.
Рассмотрим объявления:
int x=3, y=5;
object obj1, obj 2;
Здесь объявлены четыре сущности: две переменные значимого типа и две — объектного. Значимые переменные х и у проинициализированы и имеют значения, объектные переменные obj1 и obj2 являются пустыми ссылками со значением void. Рассмотрим присваивания:
obj1 = х; obj2 = у;
Эти присваивания ссылочные (из-за типа левой части), поэтому правая часть приводится к ссылочному типу. В результате неявного преобразования — операции boxing — в динамической памяти создаются два объекта, обертывающие соответственно значения переменных х и у. Сущности obj1 и obj2 получают значения ссылок на эти объекты.
Класс Math и его функции
Кроме переменных и констант, первичным материалом для построения выражений являются функции. Большинство их в проекте будут созданы самим программистом, но не обойтись и без встроенных функций. Умение работать в среде Visual Studio.Net предполагает знание встроенных возможностей этой среды, знание возможностей каркаса Framework.Net, пространств имен, доступных при программировании на языке С#, а также соответствующих встроенных классов и функций этих классов. Продолжим знакомство с возможностями, предоставляемыми пространством имен System. Мы уже познакомились с классом Convert этого пространства и частично с классом Console. Давайте рассмотрим еще один класс — класс Math, содержащий стандартные математические функции, без которых трудно обойтись при построении многих выражений. Этот класс содержит два статических поля, задающих константы E и PI, а также 23 статических метода. Методы задают:
• тригонометрические функции — Sin, Cos, Tan;
• обратные тригонометрические функции — ASin, ACcos, ATan, ATan2 (sinx, cosx);
• гиперболические функции — Tanh, Sinh, Cosh;
• экспоненту и логарифмические функции — Exp, Log, Log10;
• модуль, корень, знак — Abs, Sqrt, Sign;
• функции округления — Ceiling, Floor, Round;
• минимум, максимум, степень, остаток — Min, Max, Pow, IEEERemainder.
В особых пояснениях эти функции не нуждаются. Приведу пример:
/// <summary>
/// работа с функциями класса Math
/// </summary>
public void MathFunctions()
{
double a, b,t,t0,dt,y;
string NameFunction;
Console.WriteLine("Введите имя F(t)исследуемой функции
a*F(b*t)" + " (sin, cos, tan, cotan)");
NameFunction = Console.ReadLine();
Console.WriteLine("Введите параметр a (double)");
a= double.Parse(Console.ReadLine ());
Console.WriteLine("Введите параметр b (double)");
b= double.Parse(Console.ReadLine());
Console.WriteLine("Введите начальное время t0(double)");
t0= double.Parse(Console.ReadLine());