Юуны өмнө ОХП-ын хэлүүд болон C# хэлэнд байдаг тодорхой суурь ухагдхууны талаар ойлголтыг авах хэрэгтэй. ОХП-ын хэлэнд бараг бүх обьектууд өгөгдлийн төрлүүд байдаг.
- Хувьсагч гэдэг нь төрөл бүрийн утгуудыг авч болдог дараа нь тэдгээрийг өөр төрлийн утгаар өөрчилж болдог хэлний элемент юм. Иймээс түүнийг хувьсагч гэж нэрлэдэг. Тогтмол утга гэж бас байдаг. Тогтмол утга нь хувьсагчаас ялгаатай нь өөрийн утгаа компиляц хийх үед ганц удаа аваад тухайн утгаа дахин өөрчилдөггүй. Хувьсагч гэдгийг ямар нэгэн зүйлийг эсхүл тухайн зүйл хаана байгааг заах мэдээллийг хадгалж болдог хайрцагтай зүйрлэж болно.
- Өгөгдлийн төрөл гэдгийг хувьсагч авч болох утгуудын олонлог гэж ойлгоно. Хэрвээ бид хувьсагчийг бүхэл тоон төрлийнх гэж заавал түүнд зөвхөн бүхэл тоог эсхүл логик төрлийнх гэвэл зөвхөн логик утгыг авна гэсэн үг. Өөрөөр хэлбэл хувьсагч өөрийн төрөлд багтах утгуудын олонлогоос л утгаа авах ёстой гэсэн үг.
- Обьект гэдэг нь хувьсагч авсан тодорхой утга эсхүл тухайн утгыг авах холбоосын утгыг хувьсагчид олгосонг хэлнэ. Энэ ойлголт нь ОХП-ын үндсэн гол ойлголт байдаг.
Өгөгдлүүдийн төрлүүдийн жишээ.
Дээрх зурагт өгөгдлүүдийн энгийн төрлүүдийн жишээг харууллаа. Хувьсагчид төрөл заан өгснөөр бид түүний авч болох утгуудын олонлогийг өгч байгаа юм. Хэрвээ хувьсагчид бүхэл тоон төрөл өгсөн бол бид түүнд бутархай тоо эсхүл логик утгыг олгож болохгүй зөвхөн бүхэл тоон утгыг л олгох ёстой. Үүнийг "төрлийн хатуу хяналт" гэж нэрлэдэг. C#, JAVA гэх мэт хэлүүд хатуу төрөлжсөн хэлүүдэд ордог. Та програмын коддоо хувьсагчийг ашиглахаасаа өмнө түүний төрлийг заан зарласан байх шаардлагатай. Програмчлалын зарим хэлүүд жишээ нь PHP хувьсагчийн төрлийг заавал заахыг шаарддаггүй.
Дадлагын ажил.
Програмчлалын хэлийг сурах хамгийн сайн арга бол практик. Бид практикийн ажилдаа Visual Studio 2015 -ын C# -ийн Console Application төрлийн төслийг ашиглана. Эхлэн суралцаж байгаа хүмүүст ийм төрлийн програм зохиох нь энгийн. Ийм програм зохиохын тулд Visual Studio боловсруулалтын орчингоо нээгээд File->New->Project гэж ороод нээгдэх цонхны зүүн талын самбарт Visual C# -ийн Windows сонголтыг хийгээд дунд самбараас Console Application төрлийг сонгоорой.
Visual Studio боловсруулалтын орчинг компьютерт суулгахад Visual C# -аас гадна Visual Basic, Visual F#, Visual C++ зэрэг хэлүүдийг цуг суулгадаг. Иймээс самбарын зүүн хэсэгт хэлний сонголтоо хийхээ мартуузай. Name талбарт өгсөн нэртэй ижилхэн Solution үүсгэнэ. Нэг Solution буюу шийдэл .NET фреймворк дэмжих өөр өөр хэл дээр хүртэл бичигдсэн олон төслийг агуулж болдог. Програмын тохиргоонуудаа хийж дуусаад OK товчийг дарахад Visual Studio орчин Console Application төрлийн төслийг үүсгэнэ. Төсөлд Program нэртэй классыг агуулсан доорх агуулга бүхий Program.cs гэсэн файлыг автоматаар оруулан ирнэ.
using System;
namespace Lesson1
{
class Program
{
static void Main(string[] args)
{
}
}
}
Program класс Main гэсэн ганц аргатай бөгөөд энэ нь програмын эхлэлийн цэг юм. Програмын хувьд Main нэртэй статик арга ганцхан байж болно. Бусад програмын хэлнүүдийн адилаар C# -д өөрийн өгөгдлийн төрлийг зарлаж болно. Үүний тулд төсөлд _age гэсэн бүхэл тоон талбар бүхий Student гэсэн өгөгдлийн шинэ төрлийг зарлан өгье.
public struct Student
{
public int _age;
}
Өгөгдлийн төрлийг struct гэсэн түлхүүр үг зааж байгаа юм. Энэ нь бид утга олгогдох өгөгдлийн шинэ төрлийг үүсгэж байгааг компиляторт мэдэгдэнэ. Талбарын нэр доогуур зураасаар эхлэж байгаад анхаарна уу. Бид хичээлдээ "Унгар" тэмдэглэгээ гэж нэрлэдэг бичлэгийн дүрмийг ашиглана. Дүрмийн дагуу төрлийн талбарын нэрүүдийг доогуур зураасаар эхлээд араас нь жижиг үсгээр бичдэг. Ингэснээр төрлийн талбарыг локал хувьсагч, шинжүүдээс ялгахад амар болгоно. "Унгар" тэмдэглэгээнээс өөр програмын кодыг бичих "Camel" гэх мэтийн тэмдэглэгээнүүд бас байдаг. Код бичих аль нэгэн дүрмийг анхнаасаа хэвшил болгон ашиглаж сурах нь чухал. Одоо үүсгэсэн шинэ төрлөө програмдаа ашиглая. Үүний тулд эхлээд төрөлд тохирох хувьсагчийг
Student student = new Student();
гэж үүсгэн өгнө. Дээрх мөр Student төрлийн student нэртэй хувьсагчийг үүсгэнэ. Бид хувьсагчийн нэрийг төрлийн нэртэй ижилхэнээр гэхдээ жижиг үсгээр өгсөн. C# -хэл том жижиг үсгийн ялгадаг учраас үүнийг алдаа гэж үзэхгүй. new Student(); хэсэг төрлийн байгуулагчийг дуудан түүний хувийг үүсгэн өгнө. Бид төрлийг үүсгэхдээ түүний байгуулагч аргыг бичин өгөөгүй хэдий ч C# -ийн бүх төрлүүдэд компилятор анхдагч байгуулагч аргыг автоматаар хэрэгжүүлэн өгдөг. Ийм болохоор дээрх мөр хувьсагчийг зарлаад зогсохгүй түүнд анхны утгыг олгох ажиллагааг хийж байгаа юм. Student төрлийн хувьсагч үүсгэсэн тул одоо түүний гишүүдэд хандах боломжтой болсон. Манай төрлийн _age гэсэн бүхэл тоон ганцхан талбарт доорх командаар утга олгоё.
student._age = 20;
Шинэ төрлийг ингэж ашиглана. Энэ хүртэл бичсэн кодыг үзүүлбэл
using System;
namespace Lesson1
{
public struct Student
{
public int _age;
}
class Program
{
static void Main(string[] args)
{
Student student = new Student();
student._age = 20;
}
}
}
байгаа. Төрлийг програмд хэрхэн ашиглахыг доорх кодоос харцгаая.
// ...
class Program
{
static void Main(string[] args)
{
Student student = new Student();
student._age = 20;
Calculate(student);
Console.WriteLine(student._age);
Console.ReadLine();
}
static void Calculate(Student student)
{
student._age += 1;
}
}
// ...
Жишээнд Student төрлийн хувийг Calculate аргад параметрээр дамжуулсан байгаа. Calculate арга Student төрлийн нэг параметрийг хүлээн аваад түүний _age талбарын утгыг нэгээр нэмнэ. Програмын кодоос харвал бид эхлээд Student төрлийн student хувийг үүсгээд түүний _age талбарт 20 гэсэн утга олгоод дараа нь хувийг Calculate аргад дамжуулан талбарын утгыг нэгээр нэмээд үүний дараа талбарын утгыг дэлгэцэнд үзүүлэх болно. Энд бид 21 гэсэн утгыг хүлээн авна гэж бодож байгаа ч програмаа ажлуулбал
үр дүнг авах болно. Туршаад үзээрэй. Яагаад ийм үр дүнг авах болов. Програмын кодод багахан засвар оруулъя. Төрлийг зарлахдаа өгсөн struct түлхүүр үгийг class болгон өөрчлөе.
public class Student
{
public int _age;
}
Ингэснээр бид Student бүтцээр биш Student классаар тодорхойлогдсон өгөгдлийн төрлийг зарлаж байгаа юм. Програмаа дахин ажлуулбал
бидний хүлээж байсан үр дүнд хүрлээ. Ийм үр дүнд хэрхэн хүрснийг одоо тайлбарлая. Учир нь C# -хэлэнд стандарт болон байж болох бүх өгөгдлийн төрлүүд утгаар өгөгдөх өгөгдлийн төрлүүд, холбоосоор өгөгдөх өгөгдлийн төрлүүд гэсэн хоёр хэсэгт хуваагддаг. Бид жишээндээ Student төрлийг struct түлхүүр үгээр тодорхойлоход утгаар өгөгдөх харин class түлхүүр үгээр тодорхойлоход холбоосоор өгөгдөх өгөгдлийн төрлүүдийг үүсгэж байгаа юм.
Эдгээрийн ялгааг тайлбарлая. Ерөнхийдээ манай програмыг биелүүлэхэд ашиглагдах компьютерын санах ойг хоёр хэсэгт хуваан үзэж болно. Эхний хэсгийг "Стек" гэх бөгөөд 1 орчим мегабайт хэмжээний багахан хэмжээний санах ойг эзэлдэг. Програм ажиллагаандаа энэ хэсгийг хамгийн эрчимтэй ашигладаг. Хоёрдугаар хэсгийг "Удирдлагатай багц" гэж нэрлэнэ. Онолын хувьд энэ хэсэг компьютерын санах ойн боломжит бүх сул хэсгийг ашиглаж болох ба том обьектууд эсхүл хэмжээ нь тодорхойгүй обьектуудыг хадгалах зориулалттай. C# -хэлний утгаар өгөгдөх бүх төрлүүд "Стек"-д хадгалагдана. Ийм төрлийн хувьсагч, структурыг ямарч аргад параметрээр дамжуулахад стект байгаа төрлийг хуулбарладаг тул бид Main аргад student хувийг үүсгээд _age талбарт 20 утга олгоод хувийг Calculate аргад дамжуулсан хэдий ч үндсэн аргад үүсгэсэн хувь дамжигдахгүй харин түүний хуулбарыг үүсгэсэн болохоор програмын үр дүн 20 гэж гарч байгаа юм. Өөрөөр хэлбэл Main аргын student хувийн _age талбарт ямарч өөрчлөлт орохгүй. Үүнийг шалгахын тулд програмдаа төрлийг struct түлхүүр үгээр үүсгэсэн хэвээр үлдээгээд Calculate аргад _age талбарын утгыг дэлгэцэнд бичих командыг өгвөл 21, 20 гэсэн үр дүнг харна. C# -хэлэнд утгаар өгөгдөх төрлүүд олон байдаггүй ч эдгээрийг сайн мэдэж байх хэрэгтэй.
Харин холбоосоор өгөгдөх өгөгдлийн төрлүүдийн хувьд асуудал өөр. Бид ямарч нэгэн class -ийг үүсгэхэд тэр нь үнэн хэрэгтээ "Удирдлагатай багц" -д үүсгэгдэнэ. Харин "Стек" -т байрлах class -ийн хувь болох хувьсагчид тухайн обьектын холбоос л зөвхөн агуулагдана. Одоо бид энэ хувьсагчийг аргад параметр хэлбэрээр дамжуулан өгвөл бас л хуулбар үүсэх хэдий ч обьектын хуулбар үүсэхгүй харин түүний холбоосын хуулбар үүснэ. Харин холбоосууд "Удирдлагатай багц" -д байгаа нэг ижил обьектын холбоос учраас Calculate аргад _age талбарын утгыг өөрчилнө гэдэг нь "Удирдлагатай багц" -д байгаа обьектын талбарын утгыг өөрчилж байгаа хэрэг юм. Иймээс бид Student төрлийг class түлхүүр үгээр тодорхойлоход хүлээж байсан үр дүндээ хүрсэн. Үүнийг сайн ойлгон аваарай.
C# -хэлний өгөгдлийн бүх төрлүүд утгаар өгөгдөх, холбоосоор өгөгдөх гэж хуваагдахаас гадна энгийн ба энгийн бус өгөгдлийн төрлүүдэд бас хуваагдана. Үүнийг ойлгохын тулд доорх жишээг харцгаая.
int myVar = 250;
Student student = new Student();
Эхний мөрөөр бүхэл тоон төрлийн myVar хувьсагч зарлаад түүнд 250 гэсэн утга олгосон. Харин 2-р мөрөөр Student төрлийн student нэртэй хувьсагчийг new түлхүүр үгийг ашиглан үүсгээд төрлийн байгуулагчаар анхны утгыг олгож байгаа. .NET фреймворкийн компилятор new түлхүүр үг, байгуулагч аргыг ашиглахгүйгээр 1-р мөрөөр үзүүлсэнтэй адилаар хэсэг өгөгдлийн төрлийг зарлахыг дэмждэг. Гэхдээ 1-р мөрөөр зарлагдаж буй int төрлийн myVar хувьсагчийн цаана үнэндээ бол .NET фреймворкт стандартаар байдаг утгаар олгогдох struct төрлийн int32 төрөл байдаг. Иймээс манай кодын 1-р мөр доорх кодтой ижилхэн юм.
Int32 myVar = new Int32();
myVar = 250;
Хувьсагчийг ийм бичлэгээр зарлах нь ажиллагаа ихтэй учраас програмын кодыг хураангуйлах, ихээр ашигладаг төрлүүдийн өгөгдлийг удирдах ажиллагааг хөнгөн байлгах үүднээс энгийн төрлүүдийг оруулсан. new түлхүүр үг, байгуулагч аргыг ашиглахгүйгээр зарлаж болох төрлүүдийг энгийн төрлүүд гэж нэрлэдэг. C# -д ашигладаг өгөгдлийн энгийн төрлүүд ба тэдгээрийн .Net фреймворк дэх харгалзааны жагсаалтыг доорх зургаас харна уу.
Өгөгдлийн энгийн төрлүүд заавал бүтэц /structure/ эсхүл утгаар өгөгдөх төрлүүд байх албагүй гэдгийг дурдая. Хүснэгтийн доод хэсэгт байгаа string, object, dynamic төрлүүд бол холбоосоор өгөгдөх төрлүүд буюу классууд болно.
Програмчлалын хэлийг үзэхэд тухайн хэлний өгөгдлийн төрлүүдийг сайн ойлгож авах нь маш чухал суурь байдаг тул хичээлийн материалыг сайтар ойлгон авахыг хичээгээрэй.