حاويات .NET - متى يكون الأعضاء حسب المرجع أو حسب القيمة؟

StackOverflow https://stackoverflow.com/questions/1620277

سؤال

أتنقل بين C++ وVB.NET في مشاريع البرمجة الخاصة بي...مما يؤدي إلى ارتباك عرضي حول متى يكون شيء ما حسب القيمة أو بالرجوع إلى VB.NET.

لنفترض على سبيل المثال أن لدي مصفوفة من MyObject مملوءة بمجموعة من الكائنات.

dim MyArr(5000) of MyObject

لنفترض الآن أن المعلومات الواردة من هذه المصفوفة تنتقل عبر هياكل البيانات المختلفة:

dim MyList as new List(of MyObject)
for i as integer = 0 to 5000 step 1000
  Mylist.add(MyArr(i))
next

ثم

dim MyTable as new HashTable
dim i as integer = 0
for each O as MyObject in Mylist
  if i mod 2 = 0 then
     MyTable.add(O.ToString(), O)
  end if
next

في ظل السيناريو أعلاه، أعتقد أن كل شيء حسب المرجع.إذا قمت باستخراج إدخال من "MyTable" وقمت بتعديل أعضاء MyObject الخاص به، فأعتقد أنه سيتم تعديل الأصل في MyArr.

ومع ذلك، فقد واجهت مواقف اعتقدت فيها أن شيئًا ما كان بالإشارة، وكان بالقيمة.

هل تتم إضافة العناصر دائمًا إلى الحاويات حسب المرجع، أم أنها تتم إضافتها أحيانًا حسب القيمة؟

أنا مرتبك.

هل كانت مفيدة؟

المحلول

إنها ليست حالة "بالإشارة" أو "بالقيمة" حقًا.يتم نسخ القيمة التي تقوم بتمريرها إلى أسلوب الإضافة.ومع ذلك، بالنسبة للأنواع المرجعية، تكون هذه القيمة هي a مرجع إلى كائن ما - وإذا تعاملت مع هذا الكائن من خلال إشارات أخرى إليه، فسوف تكون قادرًا على رؤية تلك التغييرات كيفما وصلت إلى الكائن.

إذا رأيت نسخًا مستقلة من البيانات نفسها، فهذا يشير إلى أنك تستخدم نوع قيمة...ولكن إذا كنت تصنع التغييرات, ، فهذا يشير إلى أنك تستخدم ملف متقلب نوع القيمة، وهي فكرة سيئة.يجب أن تكون أنواع القيم دائمًا غير قابلة للتغيير، وإلا فإن ذلك يؤدي إلى الكثير من الارتباك.(يمكن أن تكون أنواع المراجع غير قابلة للتغيير أيضًا - تعتبر السلسلة مثالًا جيدًا.)

لمعرفة المزيد عن أنواع المراجع وأنواع القيم، راجع مقالاتي حول مراجع و حدود.لقد تمت كتابتها من منظور C#، لكن الأساسيات تنطبق على لغة VB أيضًا.

أعتقد أنه بمجرد فهمك للفرق بين قيمة نوع القيمة والمرجع، فإن المجموعات ستكون أكثر منطقية بالنسبة لك.

نصائح أخرى

يمكنك استخدام هذه القاعدة:إذا كان بإمكانك تعيين قيمة خالية إلى كائن، فسيتم تمريرها حسب المرجع.وإلا فسيتم تمريره بالقيمة.

الاستثناء لهذه القاعدة هو الأنواع والبنيات الخالية.يتم تمريرها دائمًا حسب القيمة.

أعتقد أن ذلك يعتمد على نوع العناصر.ليس على المجموعات.

على سبيل المثال:

int[] ints = new int[10];

int[0] = 1;//-)

في هذه الحالة سيتم نسخ 1 طالما أنها ValueType.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top