CodeGym /Kurslar /C# SELF /Dəyərlər körtəclərinə giriş (Value Tuples)

Dəyərlər körtəclərinə giriş (Value Tuples)

C# SELF
Səviyyə , Dərs
Mövcuddur

1. Giriş

Proqramlaşdırma — elə bil çamadan yığmaq kimidir: çox vaxt ora bir yox, bir neçə əşya qoymaq lazımdır. Məsələn, corab və telefonun adapteri. Amma iki-üç əşyanı müvəqqəti saxlamaq üçün ayrıca yeni bir çamadan-class almaq istəmirsən (class-larla bir az sonra tanış olacağıq). Bəzən sadəcə funksiyadan eyni anda iki və ya üç dəyəri qaytarmaq lazımdır. Bəs nə etməli?

Bunun bir neçə köhnə "baba" üsulu var. Məsələn, massiv qaytarmaq (int[] arr = {a, b};) və ya yalnız bir funksiya üçün ayrıca class sahələri istifadə etmək. Başqa, daha çətin yanaşmalar da var, onları növbəti dərslərdə öyrənəcəyik (out-parametrlər və ya qlobal dəyişənlər vasitəsilə ötürmək). Amma axı indi nəsə etmək istəyirsən və bunu daha asan, qısa və müasir şəkildə etmək istəyirsən!

Bunun üçün C# 7-də dəyərlər körtəcləri (Value Tuple) peyda oldu: fərqli tipli bir neçə dəyəri müvəqqəti bir qrupa yığmaq üçün çox rahat və qısa sintaksis, ayrıca data tipi ilə baş qatmadan. Bu təkcə rahat deyil, həm də kodu təəccüblü dərəcədə gözəl edir.

2. Körtəclərlə tanışlıq (Value Tuples)

Körtəclər — proqramçının magiyasıdır, bir neçə fərqli dəyəri bir "sumka"ya yığıb birlikdə daşımağa imkan verir. Onları elə bil stikerdə tez yazılmış qeydlər kimi düşün — hər xırda şey üçün ayrıca folder yaratmağa ehtiyac yoxdur!

Value Tuple (System.ValueTuple) — bu, iki ilə səkkiz arası istənilən tipli elementi saxlaya bilən struktur-xameleon kimidir. İstəyirsən bir yerdə rəqəm, string və boolean dəyəri saxla? Buyur! Körtəc heç bir şeyə etiraz etmir.

Fərqli tiplərdən körtəc yaratmaq nümunəsi


// tuple — bu (int, string, bool) - səviyyə, nickname, online
var tuple = (42, "Krutoy_Oyunçu_2024", true);

Gördün? Heç bir class, heç bir əlavə mərasim yoxdur! Sadəcə, vergüllə ayırıb mötərizəyə yığırsan — vəssalam. Bu, proqramlaşdırma dünyasında fastfood kimidir: tez, rahat və məhz lazım olan anda.
Ən gözəli — körtəclər "uçanda" yaradılır, birbaşa kodda. Elə hallar üçün idealdır ki, funksiyadan nəsə tez ötürmək və ya müvəqqəti məlumatları qruplaşdırmaq lazımdır. Niyə class-larla başını ağrıdasan, əgər problemi elegant və sadə həll etmək olar?

3. Körtəc sintaksisi və əsas elan

Ən sadə variantdan başlayaq: elementlərin adı olmadan.

var point = (10, 20);
Console.WriteLine(point.Item1); // 10
Console.WriteLine(point.Item2); // 20
Adsız körtəc: Item1, Item2 ilə çıxış

Burada point — iki elementli körtəcdir (int, int). Elementlərə çıxış — Item1, Item2 və s. sahələr vasitəsilə (yeddiyə qədər Item7). Əgər körtəcdə daha çox element varsa, səkkizinci və sonrası xüsusi Rest sahəsində olacaq (bunu bir az sonra danışacağıq). Burada point.Item1point.Item2ValueTuple<int, int> strukturunun kompilyator tərəfindən avtomatik yaradılmış sahə adlarıdır.

Niyə var?


(int, int) point = (10, 20);
Tipi açıq şəkildə göstərmək olar

Məsləhət: var istifadə etmək rahatdır, çünki C# tipi özü düzgün çıxaracaq. Amma körtəclə işlədiyini vurğulamaq istəyirsənsə, tipi açıq şəkildə göstərə bilərsən.

4. Körtəc elementlərinə ad vermək

Razılaş, Item1Item2 — heç də danışan adlar deyil. Daha yaxşısı olar! Bunun üçün adlandırılmış elementlər var:

var person = (Name: "Alisa", Age: 20);
Console.WriteLine(person.Name); // Alisa
Console.WriteLine(person.Age);  // 20
Adlandırılmış elementli körtəc

İndi elementlərin mənalı adları var. Super! Bu həm kodu başa düşmək, həm də IDE-də autocompletion üçün rahatdır.

Adları və adsız elementləri qarışdırmaq olar?

Bəli, C# buna imkan verir, amma yaxşı olar ki, körtəcdə iki və ya daha çox element varsa və ya dəyərlərin mənası fərqlidirsə, həmişə ad verəsən:

var data = (42, Name: "Bob", true);
Console.WriteLine(data.Item1); // 42
Console.WriteLine(data.Name);  // Bob
Console.WriteLine(data.Item3); // true

5. Metodlardan körtəc qaytarmaq və almaq

Ən çox rast gəlinən ssenari: metoddan bir yox, bir neçə dəyəri qaytarmaq. Məsələn, string-i parse edəndə eyni anda həm rəqəmi, həm də uğur vəziyyətini almaq.

Nümunə: İki ədədin cəmi və hasilini hesablamaq

Təsəvvür et, sənə bir funksiya yazmaq lazımdır ki, iki ədəd qəbul etsin və eyni anda onların həm cəmini, həm də hasilini qaytarsın. Körtəclər olmasa, ya out-parametrlərdən istifadə etməli olardın (bu nədir, bir az sonra öyrənəcəyik), ya da bunun üçün ayrıca class və ya struktur yaratmalı olardın (bu isə Value Tuples-un "fərqli tipli bir neçə dəyəri müvəqqəti birləşdirmək, ayrıca data tipi ilə baş qatmadan" ideyasına ziddir).

Metoddan bir neçə dəyəri körtəclə qaytarmaq:


// İki dəyərdən ibarət körtəc qaytaran metod: cəm və hasil
(int sum, int product) CalculateSumAndProduct(int a, int b)
{
    return (a + b, a * b);
}

// Metodu çağırmaq
var calculationResult = CalculateSumAndProduct(10, 5);

// Nəticəni çıxışa vermək
Console.WriteLine($"Cəm: {calculationResult.sum}");
Console.WriteLine($"Hasil: {calculationResult.product}");

6. Körtəclərin məhdudiyyətləri və xüsusiyyətləri

Hər şey ideal görünsə də, öz nüansları var. Gəlin baxaq.

Elementlərin sayı

C#-da körtəclər birbaşa 7 elementə qədər dəstəklənir. Daha çox lazımdırsa — səkkizinci və sonrası iç-içə körtəc (Rest) kimi saxlanılır. Amma əgər belə etmək lazım gəlirsə, bəlkə ayrıca struktur və ya class yaratmaq barədə düşünmək lazımdır.

var bigTuple = (1, 2, 3, 4, 5, 6, 7, 8);

// .NET səkkizinci elementdə avtomatik iç-içə körtəc yaradır
Console.WriteLine(bigTuple.Item8); // 8

Dəyişkənlik

ValueTuple — dəyişkən (mutable) strukturdur! Yaradandan sonra istənilən sahəni dəyişmək olar (amma kodda "magiyaya" çevrilməsin deyə, çox istifadə etmə).

var t = (a: 1, b: 2);
t.a = 5; // Bu işləyir!

7. Körtəclər real layihələrdə və müsahibədə nə üçün lazımdır

Körtəclər əlavə class və ya struktur yaratmadan metoddandan bir neçə dəyəri tez və rahat qaytarmağa imkan verir. Bu xüsusilə, məlumatları tez birləşdirmək lazım olanda — məsələn, kolleksiyaları seçəndə və ya filtrləyəndə, test yazanda və ya istənilən müvəqqəti hesablama zamanı çox rahatdır.

Bundan başqa, körtəclər nəticələri birbaşa bir neçə dəyişkənə deconstruct etmək üçün əladır (məsələn, LINQ sorğusundan sonra), bu da kodu daha oxunaqlı və qısa edir.

Junior-developer müsahibəsində tez-tez soruşurlar: «Metoddan necə eyni anda bir neçə dəyəri qaytarmaq olar?» — və ideal cavab ValueTuple istifadə etməkdir. Burada başa düşmək vacibdir ki, bu, adlandırılmış elementlər və deconstruction üçün daxili dəstəyi olan strukturdur, köhnə referans tipli Tuple<T1, T2>-dan fərqli olaraq.

Amma əgər sən uzunmüddətli saxlanılan və ya biznes-logikada iştirak edən məlumatlarla işləyirsənsə, və ya qaytarılan sahələrin sayı çoxdursa (yeddidən çox), daha yaxşı olar ki, ayrıca class və ya struktur yaradıb, mənalı property-lərdən istifadə edəsən.

8. Tipik səhvlər və gizli tələlər

Səhv №1: körtəc elementlərinin adında typo.
Item1, Item2 sahələri və adlandırılmış elementlər ValueTuple tipinin özündə saxlanılır. Əgər təsadüfən səhv ad yazsan, kod compile olacaq, amma mövcud olmayan sahəyə müraciət edəndə ya runtime-da səhv alacaqsan, ya da IDE belə property tapmayacaq. Həmişə adların tam uyğunluğunu yoxla!

Səhv №2: deconstruction orijinal adları saxlamır.
Adsız körtəci var (first, second) = tuple; ilə açanda, yeni dəyişkənlər firstsecond lokal yaranır, orijinal Item1/Item2 isə adsız qalır. Qarışıqlıq olmasın deyə, körtəci dərhal mənalı adlarla elan etmək yaxşıdır:

var tuple = (X: 5, Y: 10);
var (x, y) = tuple;  // x == 5, y == 10

Səhv №3: struct semantikasını qiymətləndirməmək.
ValueTuple — struktur tipidir, yəni metoda ötürəndə və ya təyin edəndə kopyalanır. Funksiya daxilində edilən dəyişikliklər yalnız lokal kopyaya təsir edir, orijinal körtəc dəyişmir. Əgər körtəc elementinin "yerində" dəyişəcəyini gözləyirsənsə, qaytarılan dəyər ilə işlədiyinə və ya referans tipindən istifadə etdiyinə əmin ol.

Şərhlər
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION