Tuples كقيم مُعادة من الأساليب
أعيدوا نتائج متعددة دون معاملات out
Tuples كقيم مُعادة من الأساليب درس مجاني في C# Academy على CoddyKit. هذا هو الدرس 4 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في C# Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة C# Academy 4 دروس في المجموع.
إرجاع عدة قيم
لا يمكن للدالة إرجاع شيء واحد إلا أن tuple تتيح لذلك الشيء الواحد تجميع عدة قيم، لتكون بديلًا واضحًا لمعلمات out.
using System;
class Program
{
static (int, int) Divide(int a, int b) => (a / b, a % b);
static void Main()
{
var result = Divide(17, 5);
Console.WriteLine(result.Item1 + " r " + result.Item2);
}
}أنواع الإرجاع المسماة لـ Tuple
تجعل تسمية العناصر المُرجعة الدالة موضحة لغرضها ذاتيًا، وتجعل موضع استدعائها سهل القراءة.
using System;
class Program
{
static (int Quotient, int Remainder) Divide(int a, int b)
{
return (a / b, a % b);
}
static void Main()
{
var r = Divide(17, 5);
Console.WriteLine("Q=" + r.Quotient + ", R=" + r.Remainder);
}
}تفكيك قيمة الإرجاع
يمكن للمستدعين تفكيك tuple المُرجعة مباشرة إلى متغيرات منفصلة.
using System;
class Program
{
static (double Min, double Max) Bounds(double[] data)
{
double min = data[0], max = data[0];
foreach (var d in data)
{
if (d < min) min = d;
if (d > max) max = d;
}
return (min, max);
}
static void Main()
{
var (lo, hi) = Bounds(new double[] { 3, 7, 1, 9, 4 });
Console.WriteLine("min=" + lo + ", max=" + hi);
}
}بديل معلمة out
قبل ظهور tuples، كان إرجاع قيم إضافية يتطلب معلمات out. وهي تعمل، لكن التصريح عنها واستدعاءها أقل سلاسة.
using System;
class Program
{
static int Divide(int a, int b, out int remainder)
{
remainder = a % b;
return a / b;
}
static void Main()
{
int rem;
int q = Divide(17, 5, out rem);
Console.WriteLine("Q=" + q + ", R=" + rem);
}
}Tuples مقابل out: قابلية القراءة
تحافظ قيم الإرجاع من نوع tuple على جميع النتائج داخل قيمة الإرجاع، وتُقرأ طبيعيًا مع Deconstruction؛ لذلك تُفضَّل عادةً على out في الحالات البسيطة.
using System;
class Program
{
static (int Sum, int Count) Stats(int[] nums)
{
int sum = 0;
foreach (var n in nums) sum += n;
return (sum, nums.Length);
}
static void Main()
{
var (sum, count) = Stats(new[] { 2, 4, 6 });
Console.WriteLine("Sum=" + sum + ", Count=" + count);
}
}إرجاع حالة وقيمة
من الأنماط الشائعة إرجاع مؤشر نجاح إلى جانب النتيجة، على نحو مشابه لـ Try-pattern، لكن ضمن tuple واحدة.
using System;
class Program
{
static (bool Ok, int Value) ParseAge(string s)
{
if (int.TryParse(s, out int n) && n >= 0)
return (true, n);
return (false, 0);
}
static void Main()
{
var r = ParseAge("42");
Console.WriteLine(r.Ok ? "Parsed " + r.Value : "Invalid");
}
}متى تظل out مفيدة
تظل out أسلوبًا معتادًا في Try-pattern المضمّن، مثل int.TryParse، حيث تكون قيمة منطقية واحدة وقيمة out واحدة أمرًا تقليديًا.
using System;
class Program
{
static void Main()
{
if (int.TryParse("100", out int value))
Console.WriteLine("Got " + value);
else
Console.WriteLine("Not a number");
}
}إرجاع عدة حقول مسماة
تتوسع Tuples لتشمل عدة نتائج من دون إجبارك على إنشاء صنف مخصص لمرة واحدة.
using System;
class Program
{
static (int Min, int Max, double Avg) Analyze(int[] nums)
{
int min = nums[0], max = nums[0], sum = 0;
foreach (var n in nums)
{
if (n < min) min = n;
if (n > max) max = n;
sum += n;
}
return (min, max, (double)sum / nums.Length);
}
static void Main()
{
var a = Analyze(new[] { 4, 8, 2, 6 });
Console.WriteLine("min=" + a.Min + ", max=" + a.Max + ", avg=" + a.Avg);
}
}متى تفضّل الصنف
إذا كانت للبيانات المجمعة سلوكيات، أو كانت تُستخدم على نطاق واسع، أو احتاجت إلى التحقق، فعرّف صنفًا أو record بدلًا من إرجاع tuple في كل مكان.
using System;
class Program
{
// Fine as a tuple: small, local, no behavior
static (int W, int H) ParseSize(string s)
{
var parts = s.Split('x');
return (int.Parse(parts[0]), int.Parse(parts[1]));
}
static void Main()
{
var (w, h) = ParseSize("16x9");
Console.WriteLine(w + " by " + h);
}
}تسلسل Tuples المُرجعة
يمكنك تمرير tuple مُرجعة مباشرة إلى عملية حسابية أخرى من خلال تفكيكها ضمن السطر.
using System;
class Program
{
static (int, int) Split(int total) => (total / 2, total - total / 2);
static void Main()
{
var (a, b) = Split(7);
Console.WriteLine("Halves: " + a + " + " + b + " = " + (a + b));
}
}تجميع المفاهيم
يُعد إرجاع tuple مسماة الطريقة الحديثة والواضحة لإعادة عدة قيم مترابطة من دالة من دون تعقيد إضافي.
using System;
class Program
{
static (bool Found, int Index) Search(int[] arr, int target)
{
for (int i = 0; i < arr.Length; i++)
if (arr[i] == target) return (true, i);
return (false, -1);
}
static void Main()
{
var r = Search(new[] { 5, 8, 12 }, 8);
Console.WriteLine(r.Found ? "At index " + r.Index : "Not found");
}
}اختبار سريع
اختبر مدى فهمك لقيم الإرجاع من نوع tuple.
مراجعة
يتيح إرجاع tuple للدالة إعادة عدة قيم دفعة واحدة، وهو خيار أنظف من out في معظم الحالات. سمِّ العناصر للوضوح، ودَع المستدعين يفككونها. واحتفظ بـ out لـ Try-pattern التقليدي، وفضّل صنفًا أو record عندما تكون للبيانات سلوكيات أو استخدام واسع.
using System;
class Program
{
static (int Sum, int Max) Go(int[] n)
{
int s = 0, m = n[0];
foreach (var x in n) { s += x; if (x > m) m = x; }
return (s, m);
}
static void Main()
{
var (sum, max) = Go(new[] { 3, 9, 5 });
Console.WriteLine(sum + " / " + max);
}
}الأسئلة الشائعة
هل درس «Tuples كقيم مُعادة من الأساليب» مجاني؟
نعم — نص درس «Tuples كقيم مُعادة من الأساليب» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة C# Academy، انتقل إلى CoddyKit PRO. تتضمن دورة C# Academy 4 دروس في المجموع.
ماذا ستتعلم في «Tuples كقيم مُعادة من الأساليب»؟
أعيدوا نتائج متعددة دون معاملات out تتمرن على C# Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ C# Academy؟
لا تُشترط خبرة سابقة. C# Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 4 من أصل 4.
كم من الوقت يستغرق درس «Tuples كقيم مُعادة من الأساليب»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس C# Academy هذا؟
نعم. كل درس في C# Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- أساسيات Value Tuples
- عناصر Tuple المسماة
- التفكيك
- Tuples كقيم مُعادة من الأساليب