منتدى فيجوال بيسك لكل العرب | منتدى المبرمجين العرب

نسخة كاملة : Tuple Return Type in C#7.0
أنت حالياً تتصفح نسخة خفيفة من المنتدى . مشاهدة نسخة كاملة مع جميع الأشكال الجمالية .
بسم الله الرحمن الرحيم
((رب اشرح لي صدري ويسر لي أمري وأحلل عقدة من لساني يفقهوا قولي))

Tuple Return Type in C#7.0

أحببت اليوم أن أتلكم عن ميزة جديدة في لغة C#.NET ألا وهي (Tuple Return Type) طبعا هذه الميزة أتت في الاصدار C#.NET 7.0 وبيئة التطوير VisualStudio 2017.


طيب ماذا تعني (Tuple Return Type)؟


هي ميزة تتيح لك أن تكتب دالة ترجع أكثر من قيمة. (Multi Return Function).


لنبيّن ذلك بمثال:
تخيل أنه لديك جدول (EmpTbl) وتريد أن تكتب دالة ترجع (Ename, Esal) اعتمادا على الــ(ID). المشكلة التي تواجهك هنا أنه كيف لي أن أقوم بكتابة دالة ترجع أكثر من قيمة؟ 
الحل هو باستخدام (Tuple Return Type).

طيب لنتعرف كيف تستخدم هذه الميزة:
قبل كل شيء يجب أن تضيف مكتبة: system.ValueTuple من NuGet لتتمكن من استخدام هذه الميزة.

1- صيغة كتابة الدالة تكون بالشكل التالي:

PHP كود :
(datatypedatatype,....) FuncName(parameter)
{
return (
valuevalue);

والاستدعاء تكون بلشكل التالي:
PHP كود :
var func=FuncName(argument)
Console.WriteLine(func.Item1);
Console.WriteLine(func.Item2); 
ملاحظة/ من الممكن استخدام (Named Argument) فتكون صيغة كتابة الدالة بالشكل التالي:
PHP كود :
(datatype datanamedatatype dataneme,....) FuncName(parameter)
{
return (
datanamevalue,datanamevalue);

والاستدعاء ستكون بالصيغة التالية:
PHP كود :
var func=FuncName(argument)
Console.WriteLine(func.dataname);
Console.WriteLine(func.dataname); 
ويفضل أن تستخدم الطريقة الثانية.

مثال توضيحي:
PHP كود :
using System;
using System.Collections.Generic;
using System.Linq;

namespace 
TupleReturnType
{
 
   class Program
    
{
 
       static List<EmpTblEmpList;
 
       static void Main(string[] args)
 
       {
 
           EmpList = new List<EmpTbl>
 
           {
 
               new EmpTbl
                
{
 
                   ID 1,
 
                   Ename "Ahmed",
 
                   Esal 33000
                
},
 
               new EmpTbl
                
{
 
                   ID=2,
 
                   Ename="Amjed",
 
                   Esal=444.666
                
}
 
           };
 
           var emp EmpSearch(EmpList[0].ID);
 
           Console.WriteLine(emp.Ename);//With named argument
 
           Console.WriteLine(emp.Esal);//With named argument
 
           Console.ReadKey();
 
       }

 
       static (string Enamedouble EsalEmpSearch(int ID)
 
       {
 
           var emp EmpList.SingleOrDefault(id => id.ID == ID);
 
           var ename emp.Ename;
 
           var esal emp.Esal;
 
           return (EnameenameEsalesal); //Named Argument
 
       }
 
   }

 
   class EmpTbl
    
{
 
       public int ID getset; }
 
       public string Ename getset; }
 
       public double Esal getset; }
 
   }

والحمد لله رب العالمين
نعم من الممكن أن استرجاع اكثر من ذلك، وبأي نوع من انواع البيانات.

بالنسبة لسؤال لا يحتاج الى Tuple Return لذا ستكون دالة ارجاع الصورة بهذا الشكل:

PHP كود :
  private Image ConvertToImage(byte[] imgBytes)
 
       {
 
           return Image.FromStream(new MemoryStream(imgBytes));
 
       
ويبارك فيك ايضا اخي الكريم

ببساطة الحل سيكون بهذا الشكل:
PHP كود :
PicBox.Image ConvertToImage((byte[])myRow["Emp_Image"]); 

هذا طبعا اثناء استدعاء الدالة ستمرر له حقل الimage كمصفوفة من bytes وهذا يعتمد على الطريقة التي تجلب بها حقل الصورة من الجدول، انا اساتخدمت DataRow لجلب البيانات لهذا ترى اسم المتغير myRow.

أما اذا اردت ان تدمج ارجاع الصورة مع المعلومات باستخدام Tuple Return سيكون الحل بهذا الشكل:
PHP كود :
static (string Enamedouble Esal,Image ImgEmpSearch(int ID)
 
       {
 
           var emp EmpList.SingleOrDefault(id => id.ID == ID);
 
           var ename emp.Ename;
 
           var esal emp.Esal;
 
           var imgBytes Image.FromStream(new MemoryStream(emp.ImageBytes)); 

 
           return (EnameenameEsalesalImgimgBytes); //Named Argument
 
       

ImageBytes: عبارة عن Property داخل الكلاس من نوع byte[].

تحياتي لكم