إستفسار حول إستعمال البراميتر كـ const
#1
Information 
السلام عليكم ورحمة الله تعالى وبركاته

سؤال : هل إذا إستعملنا براميتر لدالة ما على انه 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 مع منع التعديل على قيمه ؟
الرد
#2
إذا استخدمت براميتر بدون 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, فالهدف من تمرير البراميتر بالمرجع أو بالقيمة هو التعديل عليه.
[-] كل من 1 user says قال شكرا ل sofiane201 على المشاركة المفيدة
  • MasteranyOne
الرد
#3
بارك الله فيك وربي يحفظك
الفائدة من معرفة كيف يتم تمريره إذا قمنا بتحدبده كـ 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) .
الرد


التنقل السريع :


مستخدمين يتصفحوا هذا الموضوع: 1 ضيف