Има два типа преобразувания на примитивните типове – преобразуване по подразбиране (implicit conversion) и изрично преобразуване (explicit conversion).
В C# преобразуването по подразбиране е позволено, когато е безопасно. Например, от int към long, от float към double, от byte към short:
short a = 10;
int b = a; // implicit type conversion from short to int
|
Изричното преобразуване се използва, когато преобразуваме към по-малък тип или типовете не са директно съвместими. Например, от long към int, от double към float, от char към short, от int към char, от sbyte към uint:
В С# има специална ключова дума checked, която указва при препълване да се получава System.OverflowException вместо грешен резултат. Ключовата дума unchecked действа противоположна на checked. Ето пример за преобразуване на типове с използване на тези ключови думи:
byte b8 = 255;
short sh16 = b8; // implicit conversion
int i32 = sh16; // implicit conversion
float f = i32; // implicit - possible loss of precision!
double d = f; // implicit conversion
checked
{
byte byte8 = (byte) sh16; // explicit conversion
// OverflowException is possible!
ushort ush16 = (ushort) sh16; // explicit conversion
// OverflowException is possible if sh16 is negative!
}
unchecked
{
uint ui32 = 1234567890;
sbyte sb8 = (sbyte) ui32; // explicit conversion
// OverflowException is not thrown in unchecked mode
}
| Изброени типове (enumerations)
Изброените типове в C# се състоят от множество именувани константи. Дефинират се със запазената дума enum и наследяват типа System.Enum. Ето пример за изброен тип, който съответства на дните от седмицата:
public enum Days
{
Saturday,
Sunday,
Monday,
Tuesday,
Wednesday,
Thursday,
Friday
};
|
Изброените типове се използват за задаване на една измежду няколко възможности. Вътрешно се представят с int, но може да се зададе и друг числов тип.
Изброените типове са силно типизирани – те не се превръщат в int, освен експлицитно.
Ето пример как може да бъде използван даден изброен тип:
Days today = Days.Friday;
if (today == Days.Friday)
{
Console.WriteLine("Днес е петък.");
}
|
Както се вижда, инстанциите на изброените типове могат да приемат една от дефинираните в тях стойности.
Изброените типове могат да се използват и като съвкупност от битови флагове чрез атрибута [Flags]. Ето пример за изброен тип, който може да приема за стойност комбинация от дефинираните в него константи:
[Flags]
public enum FileAccess
{
Read = 1,
Write = 2,
Execute = 4,
ReadWrite = Read | Write
}
// ...
Console.WriteLine(
FileAccess.ReadWrite | FileAccess.Execute);
// The result is: "ReadWrite, Execute"
|
Какво представляват атрибутите и как се използват ще разгледаме по-детайлно в темата "Атрибути". Засега трябва да знаем, че чрез тях може да се асоциира допълнителна информация към типовете.
Използването на изброени типове осигурява по-високо ниво на абстракция и по този начин сорс кодът става по-разбираем и по-лесен за поддръжка.
В .NET Framework широко се използват изброени типове. Например, изброения тип ConnectionState, намиращ се в пространство от имена System.Data, характеризира състоянието на връзка към база от данни, създадена чрез ADO.NET (зададено е и числовото съответствие на всяко едно от състоянията):
public enum ConnectionState
{
Closed = 0,
Open = 1,
Connecting = 2,
Executing = 4,
Fetching = 8,
Broken = 16
}
| Идентификатори
Идентификаторите в С# се състоят от последователности от букви, цифри и знак за подчертаване като винаги започват с буква или знак за подчертаване. В тях малките и главните букви се различават. Идентификаторите могат да съдържат Unicode символи, например:
int алабала_портокала = 42;
bool \u1027\u11af = true;
|
Microsoft препоръчва се следната конвенция за именуване:
-
PascalCase – за имена на класове, пространства от имена, структури, типове, методи, свойства, константи
-
camelCase – за имена на променливи и параметри
Въпреки, че е възможно, не се препоръчва да се използват идентификатори на кирилица или друга азбука, различна от латинската.
Декларации
Декларациите на променливи в C# могат да са няколко вида (почти като в C++, Java и Delphi) – локални променливи (за даден блок), член-променливи на типа и константи. Ето пример:
int count;
string message;
|
Член-променливите могат да имат модификатори, например:
public static int mCounter;
| Константи
Константите в С# биват два вида – константи, които приемат стойността си по време на компилация (compile-time константи) и такива, които получават стойност по време на изпълнение на програмата (runtime константи).
Compile-time константи
Compile-time константите се декларират със запазената дума const. Те задължително се инициализират в момента на декларирането им и не могат да се променят след това. Те реално не съществуват като променливи в програмата. По време на компилация се заместват със стойността им. Например:
public const double PI = 3.1415926535897932;
const string COMPANY_NAME = "Менте Софт";
| Runtime константи
Runtime константите се декларират като полета с модификатора readonly. Представляват полета на типа, които са само за четене. Инициализират се по време на изпълнение (в момента на деклариране или в конструктора на типа) и не могат да се променят след като веднъж са инициализирани. Например:
public readonly DateTime NOW = DateTime.Now;
|
Сподели с приятели: |