كيفية "القيام" Byval في C#
سؤال
كما أفهمها ، يقوم C# بتمرير المعلمات إلى طرق بالرجوع إليها. في VB.NET ، يمكنك تحديد هذا مع Byval و Byref. الافتراضي هو بيفال.
هل هذا للتوافق مع Visual Basic 6.0 ، أم أنه عشوائي فقط؟ أيضًا ، كيف يمكنني تحديد ما يجب استخدامه في C#؟ أنا أحب فكرة تمرير المعلمات حسب القيمة.
المحلول
المعلمات في C# هي ، بواسطة إفتراضي مرت حسب القيمة. لا يوجد معدّل لجعل هذا صريحًا ، ولكن إذا أضفت ref
/ out
المعلمة هي مرجعية.
الارتباك المعتاد هنا هو الفرق بين:
- تمرير نوع القيمة حسب القيمة (التغييرات في نوع القيمة غير مرئية للمتصل ، ولكن يجب أن تكون أنواع القيمة غير قابلة للتغيير على أي حال)
- تمرير نوع القيمة بالرجوع إليه (التغييرات في نوع القيمة مرئية للمتصل ، ولكن يجب أن تكون أنواع القيمة غير قابلة للتغيير على أي حال-مهم جدًا سأقولها مرتين ؛ P)
- تمرير مرجع حسب القيمة (التغييرات إلى الحقول/الخصائص من النوع المرجع مرئي للمتصل ، ولكن إعادة تعيين نوع Ref-type لكائن جديد/مختلف ليس مرئي)
- تمرير مرجع بالرجوع (التغييرات في الحقول/الخصائص ، و إعادة تعيين المرجع مرئي للمتصل)
نصائح أخرى
تمرير القيمة هو الافتراضي في C#. ومع ذلك ، إذا كان المتغير الذي يتم تمريره هو نوع مرجعي ، فأنت تمرر المرجعي بالقيمة. ربما هذا هو أصل ارتباك الخاص بك.
في الأساس ، إذا قمت بتمرير مرجع بالقيمة ، فيمكنك تغيير الكائن الذي يشير إليه وستستمر هذه التغييرات خارج الطريقة ، ولكن لا يمكنك جعل متغير يشير إلى كائن مختلف ويستمر هذا التغيير خارج الطريقة.
يتم تمرير المعلمات في C# "byval" بشكل افتراضي. يجب عليك تحديد "المرجع" أو "الخروج" إذا كنت تريد سلوكًا مختلفًا.