Dec 12, 2013

ანონიმური მეთოდები


თუ არაფერი გსმენიათ ანონიმურ მეთოდებზე, ეს იმას ნიშნავს, რომ დელეგატის გამოსაყენებლად საჭირო იყო ისეთი მეთოდების გამოყენება, რომელსაც უნდა ჰქონოდა მკაფიოდ განსაზღვრული ხელწერა (დასაბრუნებელი ტიპი, პარამეტრების ტიპები და ოდენობა). სინამდვილეში კი დელეგატის გამოსაყენებლად არსებობს მეორე ალტერნატიული გზაც - ანონიმური მეთოდი. ანონიმური მეთოდი არის კოდის ბლოკი, რომელსაც უფრო არგუმენტი ეთქმის თავის თავზე და როგორც არგუმენტი ისე გადის დელეგატში.

დელეგატის განსაზღვრის სინტაქსი რა თქმა უნდა უცვლელია, უბრალოდ იცვლება პატარა დეტალები. ქვემოთ მოცემულია ძალიან მარტივი, კოდი, მაგრამ მეორე მხრივ კარგად ასახავს ანონიმური მეთოდისა და დელეგატის ერთად გამოყენებას და მათ სიმძლავრეს.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace BlogSpotAppConsole

{
    class Program
    {
        static void Main()
        {
            int num1 = 10;
 
            Func<int, int> anonDel = delegate(int param)
            {
                param += num1;
                param += 32;
                return param;
            };

            Console.WriteLine(anonDel(num1));
            Console.ReadKey();
        }
    }
}

ზემოთ მოცემული სინტაქსი შეიძლება ძალიან უცნაური მოგეჩვენოთ, მაგრამ, ჩემი აზრით მეტად მოხერხებულია. პირველად შეიძლება ეს მარტივი ოპერაცია იყოს, მაგრამ შემდეგ მიხვდებით, რომ ამ ძლიერი იარაღით ბევრი რამის გაკეთებაა შესაძლებელი.

დელეგატი Func<int, int> იღებს ერთ მთელ რიცხვს და აბრუნებს იმავე ტიპის შედეგს. anonDel არის Func ტიპის დელეგატის ცვლადი. ჩვეულებრივ დელეგატს პირდაპირ მეთოდის სახელს მივუთითებდით, რომლიც უნდა გამოიძახოს, ამის მაგივრად კი მარტივი კოდის ბლოკი გამოვიყენე - პრეფიქსით delegate და პარამეტრით, რომლიც მინდოდა გადამეცა. როგორც ხედავთ შიდა კოდი იყენებს იმ ცვლადს, რომლიც განსაზღვრულია ანონიმური მეთოდის გარეთ, ბლოკში, რომელშიც წესით სხვა სტანდარტულ მეთოდს წვდომა არ უნდა ჰქონდეს. ეს იმას ნიშნავს, რომ ის ჩაენაცვლა პარამეტრს და ჩვეულებრივ პარამეტრად გატარდა მეთოდის გამოძახების დროს. როდესაც დელეგატი გამოიძახეთ, მთელი რიცხვი გადის პარამეტრად და ბრუნდება იგივე ტიპის ცვლადი.

ძირითადი პლიუსი ის არის, რომ მცირდება კოდის სიგრძე. აღარ არის საჭირო მეთოდის განსაზღვრა, რომელიც უნდა მიეთითოს დელეგატს. ეს უფრო მაშინ ხდება გასაგები, როდესაც საჭიროა მოვლენისათვის დელეგატის გამოყენება. ასევე მცირდება კოდის სირთულე, როდესაც რამდენიმე მოვლენაა ერთად თავმოყრილი. ამ ყველაფრიდან, შეიძლება იფიქროთ, რომ ანონიმური მეთოდები უფრო სწრაფიც უნდა იყოს, მაგრამ ეს ასე არ არის. კომპილატორი კვლავ განსაზღვრავს მეთოდს პროგრამის შესრულებისას, რომელსაც ენიშნება სახელი, რომლის ცოდნაც ჩვენთვის უკვე აღარ არის საინტერესო, რადგან ყველაფერი უკვე ავტომატიკაში გადადის.

რამდენიმე წესია დასამახსოვრებელი, რომ რაიმე გაუგებრობა არ გამოიწვიოს ანონიმურმა მეთოდმა. მასში არ არის დაშვებული გადახტომის ოპერატორების გამოყენება, როგორებიცაა goto, continue და break, რომლებსაც აქვთ სამიზნე ანონიმური მეთოდის გარეთ და პირიქით, არ შეიძლება ამ ოპერატორების ანონიმური მეთოდის გარეთ განსაზღვრა, რომელთა სამიზნე ანონიმური მეთოდის შიგნით მდებარეობს.

ასევე ანონიმური მეთოდის შიგნით არ შეიძლება დაიწეროს unsafe კოდი. არ შეიძლება ref და out პარამეტრების გამოყენებაც, რომლებიც ანონიმური მეთოდის გარეთ არის ხელმისაწვდომი.

ერთის მხრივ, თუ გაქვთ ისეთი კოდი, რომელიც რამდენჯერმე უნდა გამოიყენოთ, მაშინ უმჯობესია დაწეროთ ეს ერთ მეთოდში და მოათავსოთ მასში, რადგან ანონიმური მეთოდების გამოყენებით უბრალოდ კოდის გაბერვა გამოვა და მეტი არაფერი, როდესაც ანონიმური მეთოდები შექმნილია სპეციალურად კოდის შესაკუმშად და სილამაზისთვის.

No comments:

Post a Comment