struct Point {
public int x;
public int y;
public override string ToString() { return string.Format ("({0}, {1})", x, y); }
}
static void Main(string[] args) {
// ΠΠΎΡΡΡΠΏ ΠΊ ΡΠ»Π΅Π½Π°ΠΌ ΡΠ΅ΡΠ΅Π· ΡΠΊΠ°Π·Π°ΡΠ΅Π»ΠΈ.
unsafe {
Point point;
Point* p =&point;
p-βΊx = 100;
p-βΊy = 200;
Console.WriteLine(p-βΊToString());
}
// ΠΠΎΡΡΡΠΏ ΠΊ ΡΠ»Π΅Π½Π°ΠΌ ΡΠ΅ΡΠ΅Π· ΡΠ°Π·ΡΠΌΠ΅Π½ΠΎΠ²Π°Π½ΠΈΠ΅ ΡΠΊΠ°Π·Π°ΡΠ΅Π»Π΅ΠΉ.
unsafe {
Point point;
Point* p =&point;
(*p).x = 100;
(*p).y = 200;
Console.WriteLine((*p).ToString());
}
}
ΠΠ»ΡΡΠ΅Π²ΠΎΠ΅ ΡΠ»ΠΎΠ²ΠΎ stackallocΠ Π½Π΅Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎΠΌ ΠΊΠΎΠ½ΡΠ΅ΠΊΡΡΠ΅ ΠΌΠΎΠΆΠ΅Ρ ΠΏΠΎΠ½Π°Π΄ΠΎΠ±ΠΈΡΡΡΡ ΠΎΠ±ΡΡΠ²Π»Π΅Π½ΠΈΠ΅ Π»ΠΎΠΊΠ°Π»ΡΠ½ΠΎΠΉ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΠΎΠΉ, ΡΠ°Π·ΠΌΠ΅ΡΠ°Π΅ΠΌΠΎΠΉ Π½Π΅ΠΏΠΎΡΡΠ΅Π΄ΡΡΠ²Π΅Π½Π½ΠΎ Π² ΠΏΠ°ΠΌΡΡΠΈ ΡΡΠ΅ΠΊΠ° Π²ΡΠ·ΠΎΠ²ΠΎΠ² (ΠΈ ΡΠ°ΠΊΠΈΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ Π½Π΅ ΠΏΠΎΠ΄Π»Π΅ΠΆΠ°ΡΠ΅ΠΉ "ΡΡΠΈΠ»ΠΈΠ·Π°ΡΠΈΠΈ" ΠΏΡΠΈ ΡΠ±ΠΎΡΠΊΠ΅ ΠΌΡΡΠΎΡΠ° .NET). Π§ΡΠΎΠ±Ρ ΡΠ΄Π΅Π»Π°ΡΡ ΡΠ°ΠΊΠΎΠ΅ ΠΎΠ±ΡΡΠ²Π»Π΅Π½ΠΈΠ΅, Π² C# ΠΏΡΠ΅Π΄Π»Π°Π³Π°Π΅ΡΡΡ ΠΊΠ»ΡΡΠ΅Π²ΠΎΠ΅ ΡΠ»ΠΎΠ²ΠΎ stackalloc ΡΠ²Π»ΡΡΡΠ΅Π΅ΡΡ C#-ΡΠΊΠ²ΠΈΠ²Π°Π»Π΅Π½ΡΠΎΠΌ ΡΡΠ½ΠΊΡΠΈΠΈ alloca ΠΈΠ· Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΈ Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ C. ΠΠΎΡ ΠΏΡΠΎΡΡΠΎΠΉ ΠΏΡΠΈΠΌΠ΅Ρ.
unsafe {
char* p = stackalloc char[256];
for (int k = 0; k βΉ 256; k++) p[k] = (char)k;
}
Π€ΠΈΠΊΡΠ°ΡΠΈΡ ΡΠΈΠΏΠ° Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΠΊΠ»ΡΡΠ΅Π²ΠΎΠ³ΠΎ ΡΠ»ΠΎΠ²Π° fixedΠΠ°ΠΊ ΠΏΠΎΠΊΠ°Π·ΡΠ²Π°Π΅Ρ ΠΏΡΠ΅Π΄ΡΠ΄ΡΡΠΈΠΉ ΠΏΡΠΈΠΌΠ΅Ρ, Π·Π°Π΄Π°ΡΡ ΡΠ°Π·ΠΌΠ΅ΡΠ΅Π½ΠΈΡ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠ° Π² ΠΏΠ°ΠΌΡΡΠΈ Π² ΡΠ°ΠΌΠΊΠ°Ρ Π½Π΅Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎΠ³ΠΎ ΠΊΠΎΠ½ΡΠ΅ΠΊΡΡΠ° ΠΌΠΎΠΆΠ½ΠΎ ΡΠΏΡΠΎΡΡΠΈΡΡ Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΠΊΠ»ΡΡΠ΅Π²ΠΎΠ³ΠΎ ΡΠ»ΠΎΠ²Π° stackalloc. Π ΡΠΈΠ»Ρ ΡΠ°ΠΌΠΎΠΉ ΠΏΡΠΈΡΠΎΠ΄Ρ ΡΡΠΎΠΉ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΡΡΠ°Ρ ΠΏΠ°ΠΌΡΡΡ ΠΎΡΠΈΡΠ°Π΅ΡΡΡ, ΠΊΠ°ΠΊ ΡΠΎΠ»ΡΠΊΠΎ ΠΏΡΠΎΠΈΡΡ ΠΎΠ΄ΠΈΡ Π²ΠΎΠ·Π²ΡΠ°Ρ ΠΈΠ· ΠΌΠ΅ΡΠΎΠ΄Π° ΡΠ°Π·ΠΌΠ΅ΡΠ΅Π½ΠΈΡ (ΠΏΠΎΡΠΊΠΎΠ»ΡΠΊΡ ΠΏΠ°ΠΌΡΡΡ Π²ΡΠ±ΠΈΡΠ°Π΅ΡΡΡ ΠΈΠ· ΡΡΠ΅ΠΊΠ°). ΠΠΎ ΡΠ°ΡΡΠΌΠΎΡΡΠΈΠΌ Π±ΠΎΠ»Π΅Π΅ ΡΠ»ΠΎΠΆΠ½ΡΠΉ ΠΏΡΠΈΠΌΠ΅Ρ. Π ΠΏΡΠΎΡΠ΅ΡΡΠ΅ ΠΎΠ±ΡΡΠΆΠ΄Π΅Π½ΠΈΡ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ -βΊ Π²Ρ ΡΠΎΠ·Π΄Π°Π»ΠΈ Ρ Π°ΡΠ°ΠΊΡΠ΅ΡΠΈΠ·ΡΠ΅ΠΌΡΠΉ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ΠΌ ΡΠΈΠΏ Point. ΠΠΎΠ΄ΠΎΠ±Π½ΠΎ Π²ΡΠ΅ΠΌ ΡΠΈΠΏΠ°ΠΌ, Ρ Π°ΡΠ°ΠΊΡΠ΅ΡΠΈΠ·ΡΠ΅ΠΌΡΠΌ Π·Π½Π°ΡΠ΅Π½ΠΈΡΠΌΠΈ, Π²ΡΠ΄Π΅Π»Π΅Π½Π½Π°Ρ Π΄Π»Ρ Π½Π΅Π³ΠΎ ΠΏΠ°ΠΌΡΡΡ Π² ΡΡΠ΅ΠΊΠ΅ ΠΎΡΠ²ΠΎΠ±ΠΎΠΆΠ΄Π°Π΅ΡΡΡ ΡΡΠ°Π·Ρ ΠΆΠ΅ ΠΏΠΎΡΠ»Π΅ ΠΈΡΡΠ΅Π·Π½ΠΎΠ²Π΅Π½ΠΈΡ ΠΊΠΎΠ½ΡΠ΅ΠΊΡΡΠ° Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ. Π’Π΅ΠΏΠ΅ΡΡ, Π΄Π»Ρ ΠΏΡΠΈΠΌΠ΅ΡΠ°, ΠΏΡΠ΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΠΌ ΡΡΠΎ ΡΠΈΠΏ Point Π±ΡΠ» ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ ΠΊΠ°ΠΊ ΡΡΡΠ»ΠΎΡΠ½ΡΠΉ ΡΠΈΠΏ.
class Point { //βΉ= Π’Π΅ΠΏΠ΅ΡΡ ΡΡΠΎ ΠΊΠ»Π°ΡΡ!
public int x;
public int Ρ;
public override string ToString() { return string.Format("({0}, {1})", x, y); }
}
ΠΡ Ρ ΠΎΡΠΎΡΠΎ Π·Π½Π°Π΅ΡΠ΅ ΠΎ ΡΠΎΠΌ, ΡΡΠΎ Π΅ΡΠ»ΠΈ Π²ΡΠ·ΡΠ²Π°ΡΡΠ°Ρ ΡΡΠΎΡΠΎΠ½Π° ΠΎΠ±ΡΡΠ²Π»ΡΠ΅Ρ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΡ ΡΠΈΠΏΠ° Point, Π΄Π»Ρ Π½Π΅Π΅ Π²ΡΠ΄Π΅Π»ΡΠ΅ΡΡΡ Π΄ΠΈΠ½Π°ΠΌΠΈΡΠ΅ΡΠΊΠ°Ρ ΠΏΠ°ΠΌΡΡΡ, ΡΠ²Π»ΡΡΡΠ°ΡΡΡ ΠΎΠ±ΡΠ΅ΠΊΡΠΎΠΌ Π΄Π»Ρ ΡΠ±ΠΎΡΠΊΠΈ ΠΌΡΡΠΎΡΠ°. Π’ΠΎΠ³Π΄Π° Π²ΠΎΠ·Π½ΠΈΠΊΠ°Π΅Ρ Π²ΠΎΠΏΡΠΎΡ: ΡΡΠΎ ΠΏΡΠΎΠΈΠ·ΠΎΠΉΠ΄Π΅Ρ, Π΅ΡΠ»ΠΈ Π½Π΅Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΡΠΉ ΠΊΠΎΠ½ΡΠ΅ΠΊΡΡ ΠΏΠΎΠΏΡΡΠ°Π΅ΡΡΡ Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡΠ²ΠΎΠ²Π°ΡΡ Ρ ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΡΡΠΈΠΌ ΠΎΠ±ΡΠ΅ΠΊΡΠΎΠΌ (ΠΈΠ»ΠΈ Π»ΡΠ±ΡΠΌ Π΄ΡΡΠ³ΠΈΠΌ ΠΎΠ±ΡΠ΅ΠΊΡΠΎΠΌ Π² Π΄ΠΈΠ½Π°ΠΌΠΈΡΠ΅ΡΠΊΠΎΠΉ ΠΏΠ°ΠΌΡΡΠΈ)? ΠΠΎΡΠΊΠΎΠ»ΡΠΊΡ ΡΠ±ΠΎΡΠΊΠ° ΠΌΡΡΠΎΡΠ° ΠΌΠΎΠΆΠ΅Ρ Π½Π°ΡΠ°ΡΡΡΡ Π² Π»ΡΠ±ΠΎΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ, ΠΏΡΠ΅Π΄ΡΡΠ°Π²ΡΡΠ΅ ΡΠ΅Π±Π΅ Π²ΡΡ Π±ΠΎΠ»Π΅Π·Π½Π΅Π½Π½ΠΎΡΡΡ Π΄ΠΎΡΡΡΠΏΠ° ΠΊ ΡΠ»Π΅Π½Π°ΠΌ Point, ΠΊΠΎΠ³Π΄Π° ΠΈΠ΄Π΅Ρ ΠΎΡΠΈΡΡΠΊΠ° Π΄ΠΈΠ½Π°ΠΌΠΈΡΠ΅ΡΠΊΠΎΠΉ ΠΏΠ°ΠΌΡΡΠΈ. Π’Π΅ΠΎΡΠ΅ΡΠΈΡΠ΅ΡΠΊΠΈ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, ΡΡΠΎ Π½Π΅Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΡΠΉ ΠΊΠΎΠ½ΡΠ΅ΠΊΡΡ Π±ΡΠ΄Π΅Ρ ΠΏΡΡΠ°ΡΡΡΡ Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡΠ²ΠΎΠ²Π°ΡΡ Ρ ΡΠ»Π΅Π½ΠΎΠΌ, ΠΊΠΎΡΠΎΡΡΠΉ Π±ΠΎΠ»ΡΡΠ΅ Π½Π΅ Π΄ΠΎΡΡΡΠΏΠ΅Π½ ΠΈΠ»ΠΈ Π·Π°Π½ΠΈΠΌΠ°Π΅Ρ Π½ΠΎΠ²ΠΎΠ΅ ΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π² Π΄ΠΈΠ½Π°ΠΌΠΈΡΠ΅ΡΠΊΠΎΠΉ ΠΏΠ°ΠΌΡΡΠΈ, "ΠΏΠ΅ΡΠ΅ΠΆΠΈΠ²" ΠΎΡΠ΅ΡΠ΅Π΄Π½ΡΡ Π³Π΅Π½Π΅ΡΠ°ΡΠΈΡ ΡΠΈΡΡΠΊΠΈ (ΠΈ ΡΡΠΎ, ΠΎΡΠ΅Π²ΠΈΠ΄Π½ΠΎ, ΡΠ²Π»ΡΠ΅ΡΡΡ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠΎΠΉ).
Π§ΡΠΎΠ±Ρ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²Π°ΡΡ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΡ ΡΡΡΠ»ΠΎΡΠ½ΠΎΠ³ΠΎ ΡΠΈΠΏΠ° Π² ΠΏΠ°ΠΌΡΡΠΈ ΠΈΠ· Π½Π΅Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎΠ³ΠΎ ΠΊΠΎΠ½ΡΠ΅ΠΊΡΡΠ°, Π² C# ΠΏΡΠ΅Π΄Π»Π°Π³Π°Π΅ΡΡΡ ΠΊΠ»ΡΡΠ΅Π²ΠΎΠ΅ ΡΠ»ΠΎΠ²ΠΎ fixed. ΠΠΏΠ΅ΡΠ°ΡΠΎΡ fixed ΡΡΡΠ°Π½Π°Π²Π»ΠΈΠ²Π°Π΅Ρ ΡΠΊΠ°Π·Π°ΡΠ΅Π»Ρ Π½Π° ΡΠΏΡΠ°Π²Π»ΡΠ΅ΠΌΡΠΉ ΡΠΈΠΏ ΠΈ "Π·Π°ΠΊΡΠ΅ΠΏΠ»ΡΠ΅Ρ" ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΡ Π½Π° Π²ΡΠ΅ΠΌΡ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ ΠΎΠΏΠ΅ΡΠ°ΡΠΎΡΠ°. ΠΠ΅Π· ΠΊΠ»ΡΡΠ΅Π²ΠΎΠ³ΠΎ ΡΠ»ΠΎΠ²Π° fixed Π² ΠΏΡΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠΈ ΡΠΊΠ°Π·Π°ΡΠ΅Π»Π΅ΠΉ Π½Π° ΡΠΏΡΠ°Π²Π»ΡΠ΅ΠΌΡΠ΅ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΠ΅ Π±ΡΠ»ΠΎ Π±Ρ ΠΌΠ°Π»ΠΎ ΡΠΌΡΡΠ»Π°, ΠΏΠΎΡΠΊΠΎΠ»ΡΠΊΡ Π² ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΠ΅ ΡΠ±ΠΎΡΠΊΠΈ ΠΌΡΡΠΎΡΠ°. ΡΠ°ΠΊΠΈΠ΅ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΠ΅ ΠΌΠΎΠ³ΡΡ ΠΏΠ΅ΡΠ΅ΠΌΠ΅ΡΠ°ΡΡΡΡ Π½Π΅ΠΏΡΠ΅Π΄ΡΠΊΠ°Π·ΡΠ΅ΠΌΡΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ. (ΠΠ° ΡΠ°ΠΌΠΎΠΌ Π΄Π΅Π»Π΅ ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΎΡ C# Π²ΠΎΠΎΠ±ΡΠ΅ Π½Π΅ ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΡ ΡΡΡΠ°Π½ΠΎΠ²ΠΈΡΡ ΡΠΊΠ°Π·Π°ΡΠ΅Π»Ρ Π½Π° ΡΠΏΡΠ°Π²Π»ΡΠ΅ΠΌΡΡ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΡ, Π΅ΡΠ»ΠΈ Π² ΠΎΠΏΠ΅ΡΠ°ΡΠΎΡΠ΅ Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ ΠΊΠ»ΡΡΠ΅Π²ΠΎΠ΅ ΡΠ»ΠΎΠ²ΠΎ fixed.)
Π’Π°ΠΊ ΡΡΠΎ, Π΅ΡΠ»ΠΈ Π²Ρ ΡΠΎΠ·Π΄Π°Π΄ΠΈΡΠ΅ ΡΠΈΠΏ Point (ΡΠ΅ΠΉΡΠ°Ρ ΠΏΠ΅ΡΠ΅ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Π½ΡΠΉ, ΠΊΠ°ΠΊ ΠΊΠ»Π°ΡΡ) ΠΈ Π·Π°Ρ ΠΎΡΠΈΡΠ΅ Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡΠ²ΠΎΠ²Π°ΡΡ Ρ Π΅Π³ΠΎ ΡΠ»Π΅Π½Π°ΠΌΠΈ, ΡΠΎ Π΄ΠΎΠ»ΠΆΠ½Ρ Π·Π°ΠΏΠΈΡΠ°ΡΡ ΡΠ»Π΅Π΄ΡΡΡΠΈΠΉ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ½ΡΠΉ ΠΊΠΎΠ΄ (ΠΈΠ½Π°ΡΠ΅ Π²ΠΎΠ·Π½ΠΈΠΊΠ½Π΅Ρ ΠΎΡΠΈΠ±ΠΊΠ° ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΈΠΈ).
unsafe public static void Main() {
point pt = new Point();
pt.x = 5;
pt.y = 6;
// Π€ΠΈΠΊΡΠ°ΡΠΈΡ pt, ΡΡΠΎΠ±Ρ Π½Π΅ Π΄ΠΎΠΏΡΡΡΠΈΡΡ ΠΏΠ΅ΡΠ΅ΠΌΠ΅ΡΠ΅Π½ΠΈΡ
// ΠΈΠ»ΠΈ ΡΠ΄Π°Π»Π΅Π½ΠΈΡ ΠΏΡΠΈ ΡΠ±ΠΎΡΠΊΠ΅ ΠΌΡΡΠΎΡΠ°.
fixed (int* p =&pt.x) {
// ΠΠ΅ΡΠ΅ΠΌΠ΅Π½Π½Π°Ρ int* ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ Π·Π΄Π΅ΡΡ.
}
// Π’Π΅ΠΏΠ΅ΡΡ pt Π½Π΅ Π·Π°ΡΠΈΠΊΡΠΈΡΠΎΠ²Π°Π½Π° ΠΈ ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ ΡΠ±ΡΠ°Π½Π°
// ΡΠ±ΠΎΡΡΠΈΠΊΠΎΠΌ ΠΌΡΡΠΎΡΠ°.
Console.WriteLine("ΠΠ½Π°ΡΠ΅Π½ΠΈΠ΅ Point: {0}", pt);
}
Π ΡΡΡΠ½ΠΎΡΡΠΈ, ΠΊΠ»ΡΡΠ΅Π²ΠΎΠ΅ ΡΠ»ΠΎΠ²ΠΎ fixed ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ ΡΡΡΠΎΠΈΡΡ ΠΎΠΏΠ΅ΡΠ°ΡΠΎΡΡ, Π·Π°ΠΊΡΠ΅ΠΏΠ»ΡΡΡΠΈΠ΅ ΡΡΡΠ»ΠΎΡΠ½ΡΡ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΡ Π² ΠΏΠ°ΠΌΡΡΠΈ, ΡΡΠΎΠ±Ρ Π΅Π΅ Π°Π΄ΡΠ΅Ρ ΠΎΡΡΠ°Π²Π°Π»ΡΡ ΠΏΠΎΡΡΠΎΡΠ½Π½ΡΠΌ Π½Π° Π²ΡΠ΅ΠΌΡ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ ΠΎΠΏΠ΅ΡΠ°ΡΠΎΡΠ°. ΠΠ»Ρ Π³Π°ΡΠ°Π½ΡΠΈΠΈ Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎΡΡΠΈ ΠΎΠ±ΡΠ·Π°ΡΠ΅Π»ΡΠ½ΠΎ ΡΠΈΠΊΡΠΈΡΡΠΉΡΠ΅ ΡΡΡΠ»ΠΊΠΈ ΠΏΡΠΈ Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡΠ²ΠΈΠΈ ΡΠΎ ΡΡΡΠ»ΠΎΡΠ½ΡΠΌΠΈ ΡΠΈΠΏΠ°ΠΌΠΈ ΠΈΠ· Π½Π΅Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎΠ³ΠΎ ΠΊΠΎΠ½ΡΠ΅ΠΊΡΡΠ° ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ½ΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π°.
ΠΠ»ΡΡΠ΅Π²ΠΎΠ΅ ΡΠ»ΠΎΠ²ΠΎ sizeof
Π Π·Π°ΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅ ΠΎΠ±ΡΡΠΆΠ΄Π΅Π½ΠΈΡ Π²ΠΎΠΏΡΠΎΡΠΎΠ², ΡΠ²ΡΠ·Π°Π½Π½ΡΡ Ρ Π½Π΅Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΡΠΌ ΠΊΠΎΠ½ΡΠ΅ΠΊΡΡΠΎΠΌ Π² C#, ΡΠ°ΡΡΠΌΠΎΡΡΠΈΠΌ ΠΊΠ»ΡΡΠ΅Π²ΠΎΠ΅ ΡΠ»ΠΎΠ²ΠΎ sizeof. ΠΠ°ΠΊ ΠΈ Π² C(++), ΠΊΠ»ΡΡΠ΅Π²ΠΎΠ΅ ΡΠ»ΠΎΠ²ΠΎ C# sizeof ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ Π΄Π»Ρ ΡΠΎΠ³ΠΎ, ΡΡΠΎΠ±Ρ Π²ΡΡΡΠ½ΠΈΡΡ ΡΠ°Π·ΠΌΠ΅Ρ Π² Π±Π°ΠΉΡΠ°Ρ ΡΠΈΠΏΠ°, Ρ Π°ΡΠ°ΠΊΡΠ΅ΡΠΈΠ·ΡΠ΅ΠΌΠΎΠ³ΠΎ Π·Π½Π°ΡΠ΅Π½ΠΈΡΠΌΠΈ (Π½ΠΎ Π½Π΅ ΡΡΡΠ»ΠΎΡΠ½ΠΎΠ³ΠΎ ΡΠΈΠΏΠ°), ΠΈ ΡΡΠΎ ΠΊΠ»ΡΡΠ΅Π²ΠΎΠ΅ ΡΠ»ΠΎΠ²ΠΎ ΠΌΠΎΠΆΠ΅Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡΡΡ ΡΠΎΠ»ΡΠΊΠΎ Π² ΡΠ°ΠΌΠΊΠ°Ρ Π½Π΅Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎΠ³ΠΎ ΠΊΠΎΠ½ΡΠ΅ΠΊΡΡΠ°. ΠΡΠ΅Π²ΠΈΠ΄Π½ΠΎ, ΡΡΠΎ ΡΠΊΠ°Π·Π°Π½Π½Π°Ρ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡ ΠΌΠΎΠΆΠ΅Ρ ΠΎΠΊΠ°Π·Π°ΡΡΡΡ ΠΏΠΎΠ»Π΅Π·Π½ΠΎΠΉ ΠΏΡΠΈ Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡΠ²ΠΈΠΈ Ρ Π½Π΅ΡΠΏΡΠ°Π²Π»ΡΠ΅ΠΌΡΠΌΠΈ API, ΡΠΎΠ·Π΄Π°Π½Π½ΡΠΌΠΈ Π½Π° Π±Π°Π·Π΅ C. ΠΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Π΅Π΅ ΠΎΡΠ΅Π½Ρ ΠΏΡΠΎΡΡΠΎ.
unsafe {
Console.WriteLine("ΠΠ»ΠΈΠ½Π° short ΡΠ°Π²Π½Π° {0}.", sizeof(short));
Console.WriteLine("ΠΠ»ΠΈΠ½Π° int ΡΠ°Π²Π½Π° {0}.", sizeof(int));
Console.WriteLine("ΠΠ»ΠΈΠ½Π° long ΡΠ°Π²Π½Π° {0}.", sizeof(long));
}
ΠΠΎΡΠΊΠΎΠ»ΡΠΊΡ sizeof ΠΌΠΎΠΆΠ΅Ρ ΠΎΡΠ΅Π½ΠΈΡΡ ΡΠΈΡΠ»ΠΎ Π±Π°ΠΉΡΠΎΠ² Π΄Π»Ρ Π»ΡΠ±ΠΎΠ³ΠΎ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠ°, ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΎΡ System.ValueType, ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠ»ΡΡΠ°ΡΡ ΡΠ°Π·ΠΌΠ΅ΡΡ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»ΡΡΠΊΠΈΡ ΡΡΡΡΠΊΡΡΡ. ΠΠΎΠΏΡΡΡΠΈΠΌ, ΠΌΡ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΠΈΠ»ΠΈ ΡΠ»Π΅Π΄ΡΡΡΡΡ ΡΡΡΡΠΊΡΡΡΡ.
struct MyValueType {
public short s;
public int i;
public long l;
}
Π’ΠΎΠ³Π΄Π° Π΅Π΅ ΡΠ°Π·ΠΌΠ΅ΡΡ ΠΌΠΎΠΆΠ½ΠΎ Π²ΡΡΡΠ½ΠΈΡΡ ΡΠ°ΠΊ.
unsafe {
Console.WriteLine("ΠΠ»ΠΈΠ½Π° short ΡΠ°Π²Π½Π° {0}.", sizeof(short));
Console.WriteLine("ΠΠ»ΠΈΠ½Π° int ΡΠ°Π²Π½Π° {0}.", sizeof(int));
Console.WriteLine("ΠΠ»ΠΈΠ½Π° long ΡΠ°Π²Π½Π° {0}.", sizeof(long));
Console.WriteLine("ΠΠ»ΠΈΠ½Π° MyValueType ΡΠ°Π²Π½Π° {0}."/ sizeof(MyValueType));
}
ΠΡΡ ΠΎΠ΄Π½ΡΠΉ ΠΊΠΎΠ΄. ΠΡΠΎΠ΅ΠΊΡ UnsafeCode ΡΠ°Π·ΠΌΠ΅ΡΠ΅Π½ Π² ΠΏΠΎΠ΄ΠΊΠ°ΡΠ°Π»ΠΎΠ³Π΅, ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΡΡΠ΅ΠΌ Π³Π»Π°Π²Π΅ 9.
ΠΠΈΡΠ΅ΠΊΡΠΈΠ²Ρ ΠΏΡΠ΅ΠΏΡΠΎΡΠ΅ΡΡΠΎΡΠ° C#
ΠΠΎΠ΄ΠΎΠ±Π½ΠΎ ΠΌΠ½ΠΎΠ³ΠΈΠΌ Π΄ΡΡΠ³ΠΈΠΌ ΡΠ·ΡΠΊΠ°ΠΌ ΠΈΠ· ΡΠ΅ΠΌΠ΅ΠΉΡΡΠ²Π° C, Π² C# ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°ΡΡΡΡ ΡΠ°Π·Π»ΠΈΡΠ½ΡΠ΅ ΡΠΈΠΌΠ²ΠΎΠ»Ρ, ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡΡΠΈΠ΅ Π²Π»ΠΈΡΡΡ Π½Π° ΠΏΡΠΎΡΠ΅ΡΡ ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΈΠΈ. ΠΠ΅ΡΠ΅Π΄ ΡΠ°ΡΡΠΌΠΎΡΡΠ΅Π½ΠΈΠ΅ΠΌ Π΄ΠΈΡΠ΅ΠΊΡΠΈΠ² ΠΏΡΠ΅ΠΏΡΠΎΡΠ΅ΡΡΠΎΡΠ° C# ΡΠΎΠ³Π»Π°ΡΡΠ΅ΠΌ ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΡΡΡΡ ΡΠ΅ΡΠΌΠΈΠ½ΠΎΠ»ΠΎΠ³ΠΈΡ. Π’Π΅ΡΠΌΠΈΠ½ "Π΄ΠΈΡΠ΅ΠΊΡΠΈΠ²Π° ΠΏΡΠ΅ΠΏΡΠΎΡΠ΅ΡΡΠΎΡΠ° C#" Π½Π΅ Π²ΠΏΠΎΠ»Π½Π΅ ΡΠΎΡΠ΅Π½. Π€Π°ΠΊΡΠΈΡΠ΅ΡΠΊΠΈ ΡΡΠΎΡ ΡΠ΅ΡΠΌΠΈΠ½ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ ΡΠΎΠ»ΡΠΊΠΎ Π΄Π»Ρ ΡΠΎΠ³Π»Π°ΡΠΎΠ²Π°Π½Π½ΠΎΡΡΠΈ Ρ ΡΠ·ΡΠΊΠ°ΠΌΠΈ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠΈΡΠΎΠ²Π°Π½ΠΈΡ C ΠΈ C++. Π C# Π½Π΅Ρ ΠΎΡΠ΄Π΅Π»ΡΠ½ΠΎΠ³ΠΎ ΡΠ°Π³Π° ΠΏΡΠ΅ΠΏΡΠΎΡΠ΅ΡΡΠΎΡΠ°. ΠΠΈΡΠ΅ΠΊΡΠΈΠ²Ρ ΠΏΡΠ΅ΠΏΡΠΎΡΠ΅ΡΡΠΎΡΠ° Π² C# ΡΠ²Π»ΡΡΡΡΡ ΡΠΎΡΡΠ°Π²Π½ΠΎΠΉ ΡΠ°ΡΡΡΡ ΠΏΡΠΎΡΠ΅ΡΡΠ° Π»Π΅ΠΊΡΠΈΡΠ΅ΡΠΊΠΎΠ³ΠΎ Π°Π½Π°Π»ΠΈΠ·Π° ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΎΡΠ°.
Π’Π°ΠΊ ΠΈΠ»ΠΈ ΠΈΠ½Π°ΡΠ΅, ΡΠΈΠ½ΡΠ°ΠΊΡΠΈΡ Π΄ΠΈΡΠ΅ΠΊΡΠΈΠ² ΠΏΡΠ΅ΠΏΡΠΎΡΠ΅ΡΡΠΎΡΠ° C# ΠΎΡΠ΅Π½Ρ ΠΏΠΎΡ ΠΎΠΆ Π½Π° ΡΠΈΠ½ΡΠ°ΠΊΡΠΈΡ ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΡΡΠΈΡ Π΄ΠΈΡΠ΅ΠΊΡΠΈΠ² ΠΎΡΡΠ°Π»ΡΠ½ΡΡ ΡΠ»Π΅Π½ΠΎΠ² ΡΠ΅ΠΌΠ΅ΠΉΡΡΠ²Π° C Π² ΡΠΎΠΌ, ΡΡΠΎ ΡΡΠΈ Π΄ΠΈΡΠ΅ΠΊΡΠΈΠ²Ρ Π²ΡΠ΅Π³Π΄Π° ΠΈΠΌΠ΅ΡΡ ΠΏΡΠ΅ΡΠΈΠΊΡ, ΠΎΠ±ΠΎΠ·Π½Π°ΡΠ΅Π½Π½ΡΠΉ Π·Π½Π°ΠΊΠΎΠΌ "Π΄ΠΈΠ΅Π·" (#). Π ΡΠ°Π±Π». 9.4 ΠΎΠΏΠΈΡΠ°Π½Ρ Π½Π΅ΠΊΠΎΡΠΎΡΡΠ΅ ΠΈΠ· Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ ΡΠ°ΡΡΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌΡΡ Π΄ΠΈΡΠ΅ΠΊΡΠΈΠ² (ΠΏΠΎΠ΄ΡΠΎΠ±Π½ΠΎΡΡΠΈ ΠΌΠΎΠΆΠ½ΠΎ Π½Π°ΠΉΡΠΈ Π² Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ°ΡΠΈΠΈ .NET Framework 2.0 SDK).
Π’Π°Π±Π»ΠΈΡΠ° 9.4. Π’ΠΈΠΏΠΈΡΠ½ΡΠ΅ Π΄ΠΈΡΠ΅ΠΊΡΠΈΠ²Ρ ΠΏΡΠ΅ΠΏΡΠΎΡΠ΅ΡΡΠΎΡΠ° C#
ΠΠΈΡΠ΅ΠΊΡΠΈΠ²Ρ ΠΠΏΠΈΡΠ°Π½ΠΈΠ΅ #region, #endregion ΠΡΠΏΠΎΠ»ΡΠ·ΡΡΡΡΡ Π΄Π»Ρ ΠΎΠ±ΠΎΠ·Π½Π°ΡΠ΅Π½ΠΈΡ ΡΠ°Π·Π΄Π΅Π»ΠΎΠ² ΡΡΡΠ³ΠΈΠ²Π°Π΅ΠΌΠΎΠ³ΠΎ ΠΈΡΡ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π° #define, #undef ΠΡΠΏΠΎΠ»ΡΠ·ΡΡΡΡΡ Π΄Π»Ρ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΡ ΠΈ ΠΎΡΠΌΠ΅Π½Ρ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΡ ΡΠΈΠΌΠ²ΠΎΠ»ΠΎΠ² ΡΡΠ»ΠΎΠ²Π½ΠΎΠΉ ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΈΠΈ #if, #elif, #else, #endif ΠΡΠΏΠΎΠ»ΡΠ·ΡΡΡΡΡ Π΄Π»Ρ ΡΡΠ»ΠΎΠ²Π½ΠΎΠ³ΠΎ ΠΏΡΠΎΠΏΡΡΠΊΠ° ΡΠ°Π·Π΄Π΅Π»ΠΎΠ² ΠΈΡΡ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π° (Π½Π° ΠΎΡΠ½ΠΎΠ²Π΅ ΡΠΊΠ°Π·Π°Π½Π½ΡΡ ΡΠΈΠΌΠ²ΠΎΠ»ΠΎΠ² ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΈΠΈ)Π Π°Π·Π΄Π΅Π»Ρ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ½ΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π°
ΠΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, ΠΎΠ΄Π½ΠΎΠΉ ΠΈΠ· ΡΠ°ΠΌΡΡ ΠΏΠΎΠ»Π΅Π·Π½ΡΡ Π΄ΠΈΡΠ΅ΠΊΡΠΈΠ² ΠΏΡΠ΅ΠΏΡΠΎΡΠ΅ΡΡΠΎΡΠ° ΡΠ²Π»ΡΡΡΡΡ #region ΠΈ #endregion. ΠΡΠΏΠΎΠ»ΡΠ·ΡΡ ΡΡΠΈ ΠΏΡΠΈΠ·Π½Π°ΠΊΠΈ, Π²Ρ ΡΠΊΠ°Π·ΡΠ²Π°Π΅ΡΠ΅ Π±Π»ΠΎΠΊ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ½ΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π°, ΠΊΠΎΡΠΎΡΡΠΉ ΠΌΠΎΠΆΠ½ΠΎ ΡΠΊΡΡΡΡ ΠΎΡ ΠΏΡΠΎΡΠΌΠΎΡΡΠ° ΠΈ ΠΈΠ΄Π΅Π½ΡΠΈΡΠΈΡΠΈΡΠΎΠ²Π°ΡΡ ΠΈΠ½ΡΠΎΡΠΌΠΈΡΡΡΡΠΈΠΌ ΡΠ΅ΠΊΡΡΠΎΠ²ΡΠΌ ΠΌΠ°ΡΠΊΠ΅ΡΠΎΠΌ. ΠΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ ΡΠ°Π·Π΄Π΅Π»ΠΎΠ² ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ½ΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π° ΠΌΠΎΠΆΠ΅Ρ ΡΠΏΡΠΎΡΡΠΈΡΡ ΠΎΠ±ΡΠ»ΡΠΆΠΈΠ²Π°Π½ΠΈΠ΅ Π±ΠΎΠ»ΡΡΠΈΡ ΡΠ°ΠΉΠ»ΠΎΠ² *.cs. ΠΠΎΠΆΠ½ΠΎ, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, ΡΠΎΠ·Π΄Π°ΡΡ ΠΎΠ΄ΠΈΠ½ ΡΠ°Π·Π΄Π΅Π» Π΄Π»Ρ ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΎΡΠΎΠ² ΡΠΈΠΏΠ°, Π΄ΡΡΠ³ΠΎΠΉ β Π΄Π»Ρ ΡΠ²ΠΎΠΉΡΡΠ² ΠΈ Ρ.Π΄.
class Car {
private string petName;
private int currSp;
#region Constructors
public Car() {β¦}
public Car Car(int currSp, string petName) {β¦}
#endregion
#region Properties
public int Speed {β¦}
public string Name {β¦}
#endregion
}
ΠΡΠΈ ΠΏΠΎΠΌΠ΅ΡΠ΅Π½ΠΈΠΉ ΡΠΊΠ°Π·Π°ΡΠ΅Π»Ρ ΠΌΡΡΠΈ Π½Π° ΠΌΠ°ΡΠΊΠ΅Ρ ΡΠ²Π΅ΡΠ½ΡΡΠΎΠ³ΠΎ ΡΠ°Π·Π΄Π΅Π»Π° Π²Ρ ΠΏΠΎΠ»ΡΡΠΈΡΠ΅ ΡΠ½ΠΈΠΌΠΎΠΊ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ½ΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π°, ΡΠΏΡΡΡΠ°Π½Π½ΠΎΠ³ΠΎ Π·Π° ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΡΡΠΈΠΌ Π½Π°Π·Π²Π°Π½ΠΈΠ΅ΠΌ (ΡΠΈΡ. 9.5).
Π ΠΈΡ. 9.5. Π Π°Π·Π΄Π΅Π»Ρ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ½ΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π° Π·Π° ΡΠ°Π±ΠΎΡΠΎΠΉ
Π£ΡΠ»ΠΎΠ²Π½Π°Ρ ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΈΡ
ΠΡΡΠ³ΠΎΠΉ ΠΏΠ°ΠΊΠ΅Ρ Π΄ΠΈΡΠ΅ΠΊΡΠΈΠ² ΠΏΡΠ΅ΠΏΡΠΎΡΠ΅ΡΡΠΎΡΠ° (#if, #elif, #else, #endif) ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ Π²ΡΠΏΠΎΠ»Π½ΠΈΡΡ ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΈΡ Π±Π»ΠΎΠΊΠ° ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ½ΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π° ΠΏΠΎ ΡΡΠ»ΠΎΠ²ΠΈΡ, Π±Π°Π·ΠΈΡΡΡΡΡ Π½Π° ΠΏΡΠ΅Π΄Π²Π°ΡΠΈΡΠ΅Π»ΡΠ½ΠΎ Π·Π°Π΄Π°Π½Π½ΡΡ ΡΠΈΠΌΠ²ΠΎΠ»Π°Ρ . ΠΠ»Π°ΡΡΠΈΡΠ΅ΡΠΊΠΈΠΌ Π²Π°ΡΠΈΠ°Π½ΡΠΎΠΌ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ ΡΡΠΈΡ Π΄ΠΈΡΠ΅ΠΊΡΠΈΠ² ΡΠ²Π»ΡΠ΅ΡΡΡ ΠΈΠ΄Π΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΈΡ Π±Π»ΠΎΠΊΠ° ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ½ΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π°, ΠΊΠΎΡΠΎΡΡΠΉ ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡΡΠ΅ΡΡΡ ΡΠΎΠ»ΡΠΊΠΎ ΠΏΡΠΈ ΠΎΡΠ»Π°Π΄ΠΊΠ΅ (Π° Π½Π΅ ΠΏΡΠΈ ΠΎΠΊΠΎΠ½ΡΠ°ΡΠ΅Π»ΡΠ½ΠΎΠΉ ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²ΠΊΠ΅).