Делегат ба үйл явдал 1.

Бид C# төрлийн бүрэлдхүүн хичээлүүдэд төрлийн Үйл явдлууд /Events/ ухагдхуунаас бусад гишүүдийг үзсэн. Иймээс энэ хичээлд Үйл явдлууд /Events/ ойлголтын талаар авч үзье. Үйл явдал делегат /delegate/ гэдэг ойлголт дээр суурилдаг учраас эхлээд делегат ухагдхууныг авч үзээд дараа нь үйл явдал гишүүний талаар авч үзье Delegate гэсэн үгийг монголчилбол "төлөөлөгч" гэж хэлж болох юм. Гэхдээ би делегат гэсэн нэрээр нь шууд ойлгон тогтоон авах нь илүү гэж үзлээ.

Signature - аргын тодорхойлогч

Эхлээд аргын "signature" гэсэн ухагдхуунтай танилцая. Үүнийг аргын тодорхойлогч гэж орчуулж болно. Аргын тодорхойлогч гэдэг нь түүний оролт, гаралтын параметрүүдийн төрөл ба дарааллыг хэлнэ. Үүнийг жишээн дээр харцгаая.

    public class Student
    {
        public string Move(int distance)
        {
            return null;
        }

        public int GetAge()
        {
            return 20;
        }

        public string Grow(int years)
        {
            return null;
        }

        public void SetInfo(string name, int age)
        {

        }

        public void SetSchool(int id, string number)
        {

        }
    }

Жишээнд Student классыг үзүүлсэн. Классын аргуудыг хэрхэн хэрэгжүүлсэн нь одоо бидэнд чухал биш харин тэдгээрийн тодорхойлолт чухал. Жишээний Move, Grow аргууд ижилхэн тодорхойлогчтой байгаа. Яагаад гэвэл эдгээр аргуудаас буцах утгууд ижилхэн string төрөлтэйн дээр оролтын параметрүүд бас ижилхэн int төрөлтэй. Хэдийгээр SetInfo, SetSchool аргуудад буцах утгын төрөл, оролтын параметрүүдийн төрлүүд ижилхэн боловч Move, Grow аргуудаас тодорхойлогчоороо ялгаатай. Учир нь SetInfo, SetSchool аргуудын оролтын параметрүүдийн дараалал өөр байгаа. Иймээс Student класст Move, Grow аргуудыг л ижилхэн тодорхойлогчтой гэж үзнэ. Өөрөөр аргын тодорхойлогчийг бүх параметрүүдийн төрлүүдийг агуулсан хэв байдлаар ойлгож болно. Ийм төрлийн хэдэн хэвийг доор үзүүллээ.

void (int, string) 
bool ()
DateTime (int)

Аргын тодорхойлогчид түүний нэр болон параметрүүдийн нэрүүд ямарч хамааралгүй зөвхөн оролт, гаралтын параметрүүдийн төрөл, дараалал гол үүрэгтэй.

Delegate - төлөөлөгч

Одоо делегат гэж юу болохыг авч үзье. Делегат бол нэгдүгээрт C# -ийн өгөгдлийн төрөл хоёрдугаар холбоосоор өгөгдөх /өөрөөр хэлбэл класс/ өгөгдлийн төрөл гуравдугаарт делегат бол тодорхойлогч нь түүний өөрийн зарлалтын тодорхойлолттой тохирч байгаа аргын холбоосыг хадгалж болдог өгөгдлийн төрөл. Доорх жишээг харна уу.

    public delegate int CountDelegate(string message);

    public class StringHelper
    {
        public int GetCount(string inputString)
        {
            return inputString.Length;
        }

        public int GetCountSymbolA(string inputString)
        {
            return inputString.Count(c => c == 'A');
        }

        public int GetCountSymbol(string inputString, char symbol)
        {
            return inputString.Count(c => c == symbol);
        }
    }

Жишээний эхний мөрөөр зарлагдсан CountDelegate нэртэй делегат string төрлийн ганцхан параметр аваад бүхэл тоон төрлийн утга буцаах аргын тодорхойлогчийг зарласан байгаа. Энд аргын нэр ба параметрийн нэрүүд ямарч хамааралгүй болно. Энэ тодорхойлогчид тохирох арга StringHelper класст хоёр байгаа нь GetCount, GetCountSymbolA аргууд юм. Харин GetCountSymbol арга оролтын хоёр параметртэй тул делегатын тодорхойлолтонд тохирохгүй.
Делегатыг классын төрөл гэж хэлсэн. Үүнийг шалгахын тулд програмаа компиляц хийгээд дизассемблерыг ажиллуулан MSIL кодыг харцгаавал

гэж харагдана. CountDelegate төрлийн зарлалтанд түүнийг class түлхүүр үгээр зарласан байгаа нь зураг дээрээс харагдана. Энэ нь CountDelegate төрөл бол класс гэдгийг илэрхийлнэ. CountDelegate класс учраас бид ийм төрлийн дурын хувьсагчийг зарлан ашиглаж болно. CountDelegate -ийг ашигласан жишээг харцгаана уу.

    class Program
    {
        static void Main(string[] args)
        {
            StringHelper helper = new StringHelper();

            CountDelegate d1 = helper.GetCount;
            CountDelegate d2 = helper.GetCountSymbolA;

            CountDelegate error = helper.GetCountSymbol;
        }
    }

Дээрх жишээнд бид CountDelegate төрлийн d1, d2 делегатыг зарласан. Эдгээр хувьсагчдын утгууд бол бидний өмнө нь зарласан делегатын тодорхойлолтонд / int (string) /тохирох аргуудын холбоос юм. GetCount, GetCountSymbolA аргууд делегаттай тохирох тодорхойлогчтойг бид мэдэх тул d1, d2 -д эдгээр утгуудыг өгч болно. Харин GetCountSymbol арга / int (string, char) / гэсэн өөр тодорхойлттой тул боловсруулалтын орчин алдаа өгнө. d1, d2 делегатыг хэрхэн ашиглахыг жишээг авч үзэцгээе.

using System;

namespace Lesson1
{
    class Program
    {
        static void Main(string[] args)
        {
            StringHelper helper = new StringHelper();

            CountDelegate d1 = helper.GetCount;
            CountDelegate d2 = helper.GetCountSymbolA;

            string testString = "LAMP";

            Console.WriteLine("Нийт тэмдэгтийн тоо: {0}", TestDelegate(d1, testString));
            Console.WriteLine("A тэмдэгтийн тоо: {0}", TestDelegate(d2, testString));

            Console.ReadLine();
        }

        static int TestDelegate(CountDelegate method, string testString)
        {
            return method(testString);
        }
    }
}

d1, d2 делегатыг ашиглахын тулд эхний параметрээр шалгах гэж буй аргын холбоосыг харин хоёрдахь параметрээр аргад ашиглах мөрийг авах TestDelegate аргыг зарлан өгье. Дараа нь аргуудад дамжуулах мөрийг string testString = "LAMP"; гэж зарлана. Консолд мөр гаргах эхний операторт TestDelegate аргыг дуудахдаа эхний параметрээр GetCount аргын холбоосыг хоёрдахь операторт GetCountSymbolA аргын холбоосыг өгсөн. Манай TestDelegate аргад юу хийгдэх вэ? Компилятор method хувьсагчаар дамжуулан дуудах аргын холбоосыг аваад түүний тодорхойлогчоор нь дуудна. Өөрөөр хэлбэл string төрлийн оролтын параметр аваад бүхэл тоон төрлийн утга буцаах аргыг дуудна. За ингээд програмаа ажлуулаад үзвэл

бид хүлээж байсан үр дүнгээ авна. Үнэхээр "LAMP" мөрний нийт тэмдэгт 4, мөрөнд "A" тэмдэгт нэг л байгаа. Танд ийм ердийн бус ажиллагаатай делегатууд юунд хэрэгтэй юм, тэдгээрийг хаана, хэрхэн ашигладаг юм вэ? гэсэн бодол төрж байгаа байх. Үүнийг энгийн жишээгээр тайлбарлая. Student класст Move аргыг тодорхойлон өгье.

    public class Student
    {
        public void Move(int distance)
        {
            for(int i=1; i<=distance; i++)
            {
                System.Threading.Thread.Sleep(1000);
                Console.WriteLine("Шилжилт хийгдэж байна... {0} километр явлаа.",i);
            }
        }
    }

Арга оролтын параметрээр явсан километрийн хэмжээг аваад явж өнгөрсөн зайн тухай мэдээллийг циклээр өгөх юм. Одоо Move аргыг үндсэн програмаас

    class Program
    {
        static void Main(string[] args)
        {
            Student student = new Student();
            student.Move(10);
        }
    }

гэж дуудан ажлуулбал

үр дүнг өгнө. Бүгд хэвийн сайн ажиллаж байгаа биз. Одоо манай Student класс хаа нэг веб серверт байрлаж байгаа гэж бодъё. Энэ тохиолдолд бид класст хандан түүнээс мэдээллийг хүлээн аваад консолд биш интернетээр харуулах эсхүл бид ямар нэгэн Windows програм хийж байгаа бол мэдээллийг графикийн интерфейс бүхий цонхонд үзүүлэх хэрэгтэй болно. Ерөнхий санаа бол бид Move аргаас хүлээн авсан мэдээллийг харуулах аргаас хамааралгүйгээр түүнээс мэдээллийг авах байдлаар зохион байгуулах хэрэгтэй гэсэн үг. Яг үүнийг бид одоо делегатыг ашиглан хэрэгжүүлэх болно. Эхлээд делегатаа зарлан өгье.

    public delegate void ShowMessage(string message);

Бидэнд утга буцаахгүй харин string төрлийн ганцхан параметр аваад түүнтэй ажиллах арга шаардлагатай. Иймээс манай делегатын тодорхойлогч void (string) хэлбэртэй байна. Дараа нь Move аргад энэхүү делегатын хувьсагчийг дамжуулна.

    public void Move(int distance, ShowMessage method)

Өөрөөр хэлбэл тодорхойлогчид тохирох аргын холбоосыг дамжуулна. Одоо мэдээллийг консолд үзүүлэх мөрийг

    method(string.Format("Шилжилт хийгдэж байна... {0} километр явлаа.",i));

дамжин ирэх аргаар солино. Student классын кодыг үзүүлбэл

    public delegate void ShowMessage(string message);

    public class Student
    {
        public void Move(int distance, ShowMessage method)
        {
            for(int i=1; i<=distance; i++)
            {
                System.Threading.Thread.Sleep(1000);
                method(string.Format("Шилжилт хийгдэж байна... {0} километр явлаа.",i));
            }
        }
    }

болоод байгаа. Ингэснээр бид юунд хүрсэн вэ? Одоо Move арга өөрийн мэдээллийг консолд гаргахын оронд түүнийг ямар нэгэн өөр аргад дамжуулна. Ямар арга гэдгийг Move арга өөрөө ч мэдэхгүй. Түүнд энэ аргын холбоосыг удирдах код гаднаас өгсөн. Ингэснээр бид мэдээллийг хэрэглэгчийн интерфейст гаргах аргыг бүрэн хийсвэрлэж чадлаа. Энэхүү аргыг хэрхэн ашиглах вэ? Жишээний үндсэн кодыг харуулбал

namespace Lesson1
{
    class Program
    {
        static void Main(string[] args)
        {
            Student student = new Student();
            student.Move(10);
        }
    }
}

байгаа. Одоо дараах өөрчлөлтийг хийе. Эхлээд делегатын void (string) тодорхойлогчид тохирох Show аргыг нэмнэ.

        static void Show(string message)
        {
            Console.WriteLine(message);
        }

Тэгэхлээр одоо түүний холбоосыг оруулах хэрэгтэй. Үүнийг

ShowMessage method = Show;

гэж хийнэ. Дээрх оператор манай Show аргын холбоосыг method хувьсагчид олгож байгаа юм. Одоо student классын Move аргад method хувьсагчийг хоёрдахь параметрээр өгцгөөе.

student.Move(10,method);

Ингээд гүйцээ. Манай үндсэн програмын код

namespace Lesson1
{
    class Program
    {
        static void Main(string[] args)
        {
            Student student = new Student();

            ShowMessage method = Show;

            student.Move(10,method);
        }

        static void Show(string message)
        {
            Console.WriteLine(message);
        }
    }
}

хэлбэртэй болсон. Програмаа ажлуулбал

гэсэн яг ижилхэн үр дүнг авна. Кодыг анхааралтай ажиглабал одоо Show аргад мэдээллийг үзүүлэхдээ та веб интерфейс, десктоп интерфейсээр гэх мэтээр дурын аргыг ашиглах боломжтой болсон нь харагдана. Делегат ямар хэрэгтэйг ойлгосон гэж бодож байна. Энэ хичээлийг ингээд өндөрлөе. Дараагийн хичээлд үйл явдлын талаар үргэлжлүүлэн үзэх тул делегатын талаар сайн ойлгон аваарай.

Мэдээлэл таалагдсан бол найзуудтайгаа хуваалцаарай.

  Нээгдсэн тоо: 1183 Төлбөртэй

Илэрхийллийн модны талаар бид Лямбда илэрхийлэл хичээлд цухас дурдсан. Энэ хичээлээр илэрхийллийн модны ухагдхууныг дэлгэрүүлэн авч үзэх болно. Илэрхийллийн мод ухагдхуун нилээд хүндэвтэр сэдэв тул та

сэдвүүдийн талаар тодорхой мэдлэгтэй байх хэрэгтэй. Иймээс дээрх сэдвүүдийн талаарх хичээлүүдийг үзэхийг зөвлөе. Дээр дурдсан ухагдхуунуудын талаар мэдлэгтэй бол илэрхийллийн мод ухагдхууныг ойлгоход танд онцын хүндрэл үүсэхгүй.

  Нээгдсэн тоо: 2292 Төлбөртэй

ОХП-д классын тухай ойлголт чухал байр суурийг эзэлдэг. Иймээс классын төрлүүдийн талаар сайтар ойлгосон байх шаардлагатай. Хичээлээр бид битүүмжлэгдсэн, статик, абстракт классуудын талаар авч үзнэ. Классын эдгээр төрлүүдийг хөнгөнөөс нь хүнд рүү нь битүүмжлэгдсэн, статик, абстракт гэсэн дарааллаар судлана.

Битүүмжлэгдсэн буюу sealed класс

Классыг тэмдэглэх sealed түлхүүр үгийн орчуулга нь битүүмжлэгдсэн гэсэн байгаа юм. Орчуулга оновчтой болоогүй байж мэдэх тул sealed class гэсэн англи нэрээр нь тогтоон авбал илүү сайн. sealed түлхүүр үг юуг илэрхийлэх, хаана хэрхэн ашиглах вэ? Хэрвээ классыг sealed түлхүүр үгээр тэмдэглэсэн бол тэр эцэг класс болж болохгүй. Өөрөөр хэлбэл sealed классаас удамшуулж болохгүй. Иймээс удамшилтын гинж sealed түлхүүр үгээр тэмдэглэгдсэн класс дээр тасрах болно.

  Нээгдсэн тоо: 50 Бүртгүүлэх

.NET -д бүх классууд бүр бидний үүсгэсэн классууд, жишээ нь System.Int32 гэх мэтүүд суурь төрлүүд далд хэлбэрээр Object классаас үүсдэг. Кодод Object классийг сууриар зааж өгөөгүй байсан ч анхдагчаар далд хэлбэрээр Object класс удамшилтын шатлалын оройд байрладаг. Иймээс бүх төрлүүд, классууд System.Object класст тодорхойлогдсон аргуудыг хэрэгжүүлж болно. Эдгээр аргуудыг авч үзье.

  Нээгдсэн тоо: 53 Бүртгүүлэх

Абстракт үйлдвэр (Abstract Factory) хэв өөр хоорондоо холбоотой тодорхой интерфейстэй обьектуудын бүлгийг тухайн обьектуудын төрлийг заахгүйгээр үүсгэх боломжийг олгодог.

Хэвийг хаана ашиглах

  • Систем шинэ обьектын бүрдүүлэгч ба үүсгэх аргаас хамааралгүй байх хэрэгтэй үед
  • Үүсгэгдэж буй обьектууд өөр хоорондоо холбоотойн дээр хамтдаа ашиглагдах үед

Математикийн үйлдлүүдэд нэг ба тэг тоонууд онцгой шинжүүдтэй. Үржих үйлдэлд нэг ба тэг

Нээгдсэн тоо : 10

 

Давталт (Iterator) паттерн нийлмэл обьектын бүх элементүүдэд тэдгээрийн дотоод бүтцийг задлахгүйгээр хандах абстракт интерфейсийг тодорхойлдог. C# хэл дээр…

Нээгдсэн тоо : 12

 

Тодорхой нөхцөлд жишээ нь тоог тэгд хуваах гэх мэт тохиолдолд систем өөрөө онцгой нөхцлийн генерацийг хийдэг. Гэхдээ C#

Нээгдсэн тоо : 13

 

Програмийг удирдах цэсийг нээх болон хаах ажиллагааг хариуцах компонентийг боловсруулъя. Үүний тулд төслийн components хавтаст Navigation хавтасыг үүсгээд…

Нээгдсэн тоо : 15

 

Арифметикийн үндсэн 4 үйлдлийн нэг бол үржих. Нэмэх , хасах үйлдлийн талаар…

Нээгдсэн тоо : 13

 

Шаблоны арга (Template Method) хэв дэд классуудад алгоритмын бүтцийг өөрчлөхгүйгээр зарим алхамуудыг дахин тодорхойлох боломж олгосон ерөнхий алгоритмыг…

Нээгдсэн тоо : 17

 

Гурвалжны медиантай холбоотой бодлогууд шалгалт шүүлэгт ихээр орж ирдэг. Иймээс гурвалжны медиан, түүний шинжүүдийг бүрэн мэддэг байх хэрэгтэй.

Нээгдсэн тоо : 23

 

Бүх онцгой нөхцлүүдийн суурь бол Exception төрөл. Төрөлд онцгой нөхцлийн талаарх мэдээллийг авч болох хэдэн шинжийг тодорхойлсон байдаг.…

Нээгдсэн тоо : 22

 

Сорилгын үр дүнгийн QuizResult компонентод сорилгыг дахин эхлүүлэх товч байгаа. react -ийг зохиогчид  програмийг компонент дээр суурилан хийх…

Нээгдсэн тоо : 21

 
Энэ долоо хоногт

илэрхийллийг хялбарчил

Нээгдсэн тоо : 996

 

ABCD трапецийн бага диагонал BD=6 бөгөөд суурьтай перпендикуляр. Трапецийн AD=3, DC=12 бол B, D мохоо өнцгийн нийлбэрийг ол.

Нээгдсэн тоо : 2219

 

Геометрийн шалгалтанд сурагчид шалгалтын асуултуудаас нэг асуулт ирнэ. Сурагч "Дотоод өнцөг" сэдвийн асуултуудад хариулах магадлал 0,35 харин "Багтаасан тойрог" сэдвийн асуултуудад хариулах ммагадлал 0,2 байжээ. Шалгалтын асуултуудад энэ хоёр сэдэвт хоёуланд зэрэг хамаарах асуулт байхгүй бол сурагчид энэ хоёр сэдвийн аль нэгэнд нь хамааралтай асуулт ирэх магадлалыг ол.

Нээгдсэн тоо : 549