delphi4arab منتديات دلفي للعرب

نسخة كاملة : إستفسار حول إستعمال البراميتر كـ const
أنت حالياً تتصفح نسخة خفيفة من المنتدى . مشاهدة نسخة كاملة مع جميع الأشكال الجمالية .
السلام عليكم ورحمة الله تعالى وبركاته

سؤال : هل إذا إستعملنا براميتر لدالة ما على انه const يتم نقله [size=x-small]by reference او by value ؟[/size]

لحظ :
كود :
procedure TForm1.Button1Click(Sender: TObject); var   i : integer; begin   i:= 2020;   memo1.Lines.Add(MyFunc(i).ToString); end; function TForm1.MyFunc(const s: integer): integer; begin   result := s; end;


هل : 
1- يتم نسخ قيمة i ووضعها في s.
2- يصبح s يؤشر الى i مع منع التعديل على قيمه ؟
إذا استخدمت براميتر بدون const أو var فهذا value parameter ويتأثر حسب نوعه مثلا لو مررت integer وهو "value type" فسيتم استخدام نسخة داخل التابع, ولو مررت براميتر "reference type" مثل  object لكلاس ما فلا يتم استخدام نسخة اخرى لأنك مررت مؤشر فقط ويمكن تغيير قيمته.

أما إذا خصصت البراميتر ب var فهذا يعني أنك ستمرره الى التابع مرجعيا by reference سواء مررت integer أو object سيمكنك التعديل عليه.

وإذا كان البراميتر const فهذا يعني أنك لن تعدل عليه ولا يهم هنا by reference أو by value, مع أنه إذا مررت object يمكن التعديل على خصائصه "لا تنسى أنه مؤشر فقط".

يمكنك الاطلاع على التوثيق ستجد فيه شرحا أفضل.

ج1: نعم يتم استخدام نسخة إذا كان البراميتر value type.
ج2: لا يهم طالما أنه const, فالهدف من تمرير البراميتر بالمرجع أو بالقيمة هو التعديل عليه.
بارك الله فيك وربي يحفظك
الفائدة من معرفة كيف يتم تمريره إذا قمنا بتحدبده كـ const , هو معرفة هل يتم حجز مساحة إضافية في الذاكرة او لا يجب معرفة هذه التفاصيل, لكي يكون برنامجك سريع ولا يستهلك الذاكرة.
الحمدلله بعد الإطلاع على الرابط : Parameters (Delphi) فهت : انه عند تعريف البراميتر على انه const فإنه يتم تمريره (by value) أو (by reference) على حسب الكمبيلر المستخدم وهذا النص الأصلي (Constant parameters may be passed to the function by value or by reference, depending on the specific compiler used. ) ولإجباره على تمريره كا (by reference) نضع الكلمة [Ref] بعد كلمة const مثل : function FunctionName(const [Ref] parameter1: Class1Name; [Ref] const parameter2: Class2Name);
قمت بتجربة ووجدت أن الدلفي يمرر البراميتر المعرف كا const يمرره بـ (by value) .