الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

استخدام Out و ref ? وأسئلة أخرى ..

مغلق
بدأه الاحتراف في 21 يوليو 2005 · 11 رد · 4,212 مشاهدة · في Microsoft Visual C#.NET
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم

1.

اثناء قراءتي ودراستي للـ سي شارب ، وجدا شرحا حول استخدام OUTو وايضا REF .. فما الفرق بينهما ؟؟

إذا أن كلاهما تعيد قيمة في المتغير الخاص بهما ؟؟

2.

لدي ادوات كنت استخدمها في فيجوال بيسك 6 وهي مصممة للعمل مع معظم لغات البرمجة ، كيف لي ان أتأكد من انا متوافقة مع السي شارب ؟؟ أقصد ما هي الطرق والادوات التي يحبذ استخدامها لقياس مدى توافق الادوات مع اللغة ؟

3.

قرأت كثير وسمعت أكثر عن موضوع سهولة قراءة السورس الخاص بالبرامج المصممة بـ Net. ، فهل تم التوصل الى حل او الى طريقة لحماية البرامج ؟؟ اعمل على تصميم برنامج وهو محمي .. وبالطبع فإن لا فائدة من الحماية اذا كان السورس يمكن قراءته :s

شكرا على اهتمامكم

#2
اقتباس
OUTو وايضا REF .. فما الفرق بينهما

بالفعل يا أخي ... انهم متشابهان جدا , ولكن في بعض الحالات ستجد أن استخدام ref أصبح غير منطقي لأن ref تتطلب منك اسناد قيمة أوليه للمتغيرات بينما out لا تتطلب ذلك.

افرض أنك تريد عمل Method تستقبل أى متغيرين من نوع int وتقوم بتغيير قيمتها الى 200 مثلا.

static void Main()
{
int a; //Error
int b; //Error
MakeThem200(ref a,ref b);
}

static void MakeThem200(ref int first,ref int second)
{
first = 200;
second = 200;
}

في الكود السابق قررنا استخدام ref ومادامنا قررنا ذلك فيجب علينا اسناد قيم للمتغيرات قبل ارسالها ... ونحن لم نقم بذلك في الكود السابق والنتيجه ظهور Error ::

Use of unassigned local variable 'a'
Use of unassigned local variable 'b'

الحل في هذه الحاله إما نقوم باستخدام out بدلا من ref ( فقط نستبدل كلمة ref بكلمة out في الكود السابق ) ,,, أو نقوم باستخدام ref ولكن يجب علينا الانتباه هذه المره باسناد قيم مبدأيه للـ a وللـ b قبل ارسالهم لـ MakeThem200 .. وطبعا هذا أمر غريب جدا ويصبح استخدام ref في حالتنا هذه غير منطقي .... فلماذا نضطر الى اسناد قيم للمتغيرات مادمنا سنغير هذه القيم فورا!!!!

#Read

http://MoutazShams.blogspot.com

projects003.gif

أعتذر عن التغيب هذه الأيام نظرا للانشغال المريب

#3

السلام على من اتبع الهدى ورحمة الله وبركاته

أخي العزيز معتز باشا شرحك مفهوم جدا بالنسبة للفرق بينهم

ولكن ما فائدة إستخدامهم أصلا وماذا لو لم نستخدمهم

وجزاك الله خيرا

Name : Ahmed H. Alawady

Web Site : Alawady.info

Email : alawady_ahmed@hotmail.com

Tel : +2 012 345 6808

#4

فائدة أستخدام الreo and out

أفترض ان انت عندك برنامج وأى تغير يحدث للمتغير فى اى method عاوز الmain تحس بية

عن طريق استخدام ref and out

وأيضا لو انت عاوز الدالة بتاعتك ترجع اكتر من قيمة يبقى تستخدمref and out

وأيضا ف حالة pass by value يعنى بدون ref or out

بيتم عمل copy من المتغيرات التى تم تمريراها فى الmain وتلك الcpy تكون للمتغيرات الموجودة فى ال method

وأيضا لو دة ميزة من عدم استهلاك الram فى عمل copy للمتغيرات ثم بعد ذلك عمل assigned

للقيمة المراد رجوعها الى الmain

أرجو ان تكون أستفدت

Muhammad Allam

Computer Science

@Resource(MappedURL="My Blog" )

#5

السلام على من اتبع الهدى ورحمة الله وبركاته

أخي الكريم علام جزاك الله خيرا لقد استفدت ولكن هناك جزء لم أفهمة

اقتباس
وأيضا لو انت عاوز الدالة بتاعتك ترجع اكتر من قيمة يبقى تستخدمref and out

أرجوا شرحها بمثال الجزء السابق فقط

وجزاك الله خيرا

Name : Ahmed H. Alawady

Web Site : Alawady.info

Email : alawady_ahmed@hotmail.com

Tel : +2 012 345 6808

#6

السلام عليك يا اخى

اقتباس
وأيضا لو انت عاوز الدالة بتاعتك ترجع اكتر من قيمة يبقى تستخدمref and out

الاخ علاء فى هذا الجزء على ما اعتقد لا يقصد ان الداله يكون فيها اكثر من جملة return

او بالتحديد لا يقصد ان الداله تقوم بارجاع اكثر من قيمه ولكن تقوم بارجاع اكثر من جزء من معلومه

لان الداله تقوم بارجاع قيمه واحده فى كل مره تم استدعائها فيها كما ان الداله تنتهى عند هذه الجمله

وعلى ما ظننى قد قرأت مثال يوضح هذه الفكره فى كتاب "c# the complete reference"

و هذا هو المثال

public int parts(double n,out double frac)
{
int whole;
whole=(int) n;
frac= n - whole;
return whole;
}

هذه الداله تقوم بأخد عدد ثم تقسمه الى جزئين جزء صحيح و جزء كسرى (تقوم بأكثر من مهمه )

العدد الصحيح يتم تخزينه فى المتغير whole والذى تقوم الداله بارجاعه ام الكسرى فيتم تخزينه فى المتغير frac لاحظ انه من ضمن ال parameters

سوف تتضح الفكره عندما نقوم باستخدام الداله داخل الmain

public static void main()
{
int i;
double f;
i=parts(10.125,out f);
Console.WriteLine("integer portion is :"+i);
Console.WriteLine("fractional part is:"+f);

خرج البرنامج يكون

integer portion is :10

fractional portion is :0.125

لاحظ انه بدون استخدام ال out لن يكون الناتج بنفس الشكل لانه فى هذه الحاله لن تتغير القيمه الاصليه

للمتغير f (حيث انه بدون استخدام ال out كما وضح الخ علاء والاخ معتز لن يتم تغير القيمه الاساسيه للمتغير ولكن يتم اخذ نسخه منه و التغيير فيها)

اتمنى ان اكون قد افدت يا اخى

#7

من استخدام العملي ل out

انك تستخدمها في تطبيق الداتا بيز لحجز مكان لمتغير من نوع int

لمعرفة مثلا ان عمليه تحديث البيانات تمت بنجاح ام لا

مثلا ال Function

public int UpdateMethod( "StoredProcedureName" , Array Of Parameters , out int)
{
// u pass ur parameters
//then u call the stored procedure sure after openning the connection
//next U check the return value of the update procedure and save it to int
//  then u reurn back the int after closing the connection
return int;


}

و بعدت تمريرك لنتيجه الupdate

يمكنك من خلال الكود معرفه اذا كانت قد تمت العملية بنجاح اما لا من خلال

int= =1

معلش يمكن اكون خدتك لبعيد :)

بس ده اكثر استخدام شائع لل out

عارف ان ردي مبهم شويه :]

تم تعديل هذه المشاركة بواسطة Eclipse في 22 يوليو 2005 في 02:00

#8
اقتباس
قرأت كثير وسمعت أكثر عن موضوع سهولة قراءة السورس الخاص بالبرامج المصممة بـ Net. ، فهل تم التوصل الى حل او الى طريقة لحماية البرامج ؟؟ اعمل على تصميم برنامج وهو محمي .. وبالطبع فإن لا فائدة من الحماية اذا كان السورس يمكن قراءته

بالنسبه لهذا الموضوع فالسبب فيه ظهور ما يسمى بال DECOMPILERS بانواعه المختلفه

مثل

decompiler.net

http://www.junglecreatures.com/DesktopDefa...index=2&tabid=3

Exemplar/Anakrino

http://www.saurik.com/net/exemplar/

Reflector .NET Decompiler ويعتبر اشهرهم

http://www.aisto.com/roeder/dotnet/

Salamander .NET Decompiler

http://www.remotesoft.com/salamander/index.html

وغيرهم ....وجميعهم يعمل بتكنولوجيا الهندسه العكسيه لتحليل البرنامج للكود المصدرى الخاص به

وانا شخصياً جربت ال reflector

ونظراً لان لكل داء دواء ...فقد ظهر ما يسمى بال obfuscators

ومنهم

Spices.Net

http://9rays.net/products/spices

Deploy.NET

http://www.junglecreatures.com/

Dotfuscator .NET Obfuscator وهو اشهرهم على الاطلاق

http://www.preemptive.com/

وانا جربت الكثير من هذه الادوات وهى تعمل بصوره جيده....وتمنع ال decompilers من محاوله فك الكود الخاص بالبرنامج

ولكن المشكله ان هذه البرامج والادوات ليست مجانيه ويمكنك فقط تنزيل النسخ التجريبيه منها ولا يمكنك استعمالها بحرية تامه الا بعد شرائها

#9

والله جميع الاخوة الافاضل تم توضيح ما أريدة وبصراحة انا معانديش اى اضافات

شكرا لكم

Muhammad Allam

Computer Science

@Resource(MappedURL="My Blog" )

#10

بسم الله الرحمن الرحيم

يعنى هوضح بمثال سهل وبسيط الref and out

لاحظ ذلك الكود حيث عبارة عن كود يعمل swap بين قمتين

	class MainClass
	{
  
  public void swap( int x, int y)
  {
 	 Console.WriteLine("before swap in method the val of x  {0},val of y   {1}",x,y+"\n");
 	 int tmp;
 	 tmp=x;
 	 x=y;
 	 y=tmp;
 	 Console.WriteLine("Aftrer swap in method the val of x  {0},val of y   {1}",x,y+"\n");

  }
  static void Main(string[] args)
  {
 	 int x=12,y=20;
 	 MainClass obj=new MainClass();
 	 Console.WriteLine("before swap in Main the val of x  {0},val of y   {1}",x,y+"\n");
 	 obj.swap( x, y);
 	 Console.WriteLine("After swap in Main the val of x  {0},val of y   {1}",x,y+"\n");
  }
	}

يعنى من البرنامج السابق ان التغير ف قمتى الx,y لن تحس بة المتغيرات ف الmian كما قلت انة بيعمل copy من المتغيرات

طب والحل استخدم ref

أنظر الى ذلك الكود بعد التعديل

class MainClass
	{
  
  public void swap(ref int x,ref int y)
  {
 	 Console.WriteLine("before swap in method the val of x  {0},val of y   {1}",x,y+"\n");
 	 int tmp;
 	 tmp=x;
 	 x=y;
 	 y=tmp;
 	 Console.WriteLine("Aftrer swap in method the val of x  {0},val of y   {1}",x,y+"\n");

  }
  static void Main(string[] args)
  {
 	 int x=12,y=20;
 	 MainClass obj=new MainClass();
 	 Console.WriteLine("before swap in Main the val of x  {0},val of y   {1}",x,y+"\n");
 	 obj.swap(ref x,ref y);
 	 Console.WriteLine("After swap in Main the val of x  {0},val of y   {1}",x,y+"\n");
  }
	}

يبقى الحل استخدام الref أما عن الout زى الref ولكن الفرق بينهما كما وضح الاستاذ معتز

ودى فائدة الout من كتاب windows app mspress

Output parameters are useful if you want a method to return more than a single value. An output parameter is specified by using the out keyword. Output parameters are always passed by reference and do not need to be initialized before use. The following example demonstrates output

أنظر ذلك الكود

public void aWord (out string Word){   Word = "Mambo";}public void ShowWord(){   string Word;   aWord(out Word);   Console.Writeline("The word of the day is " + Word);}

أما مثال الاخ Eclipse

وهو انك تستخدمها في تطبيق الداتا بيز لحجز مكان لمتغير من نوع int

مثال جميل جدا وعجبنى حيث لازمة ذلك المتغير كflag علشان أعرف المستخدم ان عملية الupdate تمت بسلام ام لا

وفيدتة انة ممكن عند عمل update ممكن يحصلpower failure أو الجهاز يهنج وبالتالى راحت الdata التى خزنها المستخدم

Muhammad Allam

Computer Science

@Resource(MappedURL="My Blog" )

#11

جزاك الله كل الخير يا اخى :rolleyes:

#12

السلام عليكم

بارك الله فيكم اخواني .. لقد اتضحت الصورة :)

ولكن ماذا عن سؤالي الثاني :

لدي ادوات كنت استخدمها في فيجوال بيسك 6 وهي مصممة للعمل مع معظم لغات البرمجة ، كيف لي ان أتأكد من انا متوافقة مع السي شارب ؟؟ أقصد ما هي الطرق والادوات التي يحبذ استخدامها لقياس مدى توافق الادوات مع اللغة ؟

وهل اضيفها على انها COM او Reference ?? وما الفرق بينهما ؟

شكرا جزيلا

هذا الموضوع مغلق.

مواضيع مشابهة