سؤال

غير واضحة إلى حد ما بالنسبة لي هي المراجع (المؤشرات؟) للفصول في VB.NET. يمكن الإجابة على السؤال الذي أنا على وشك طرحه بسبب الاختبار قليلا، لكنني كنت أتساءل عما إذا كان بإمكان أي شخص نشر تفسير لائق (أو روابط أيضا).

إذا قمت بإنشاء فئة:

Public Class ReferenceClass

    Private myBooleanValue As Boolean = False
    Public Property BooleanValue As Boolean
        Get
            Return myBooleanValue
        End Get
        Set(value As Boolean)
            myBooleanValue = value
        End Set
    End Property

End Class

ثم فئة تستخدم في الواقع هذه الفئة كخاصية:

Public Class UsingClass

     Private myReference As ReferenceClass
     Public Property Reference As ReferenceClass
        Get
             return myReference
         End Get
         Set(value As ReferenceClass)
             myReference = value
         End Set
     End Property

     Public Sub New(ByVal Reference As ReferenceClass)
         myReference = Reference
     End Sub

End Class

ثم استخدمه مثل هذا:

Public Class RuntimeOrSomething

     Public Shared myReference As ReferenceClass
     Public Shared ReadOnly Property Reference As ReferenceClass
         Get
             If myReference Is Nothing Then myReference = new ReferenceClass()
             return myReference
         End Get
     End Property

     Public Shared Function BooleanCheck() As Boolean
         Reference.BooleanValue = True
         Dim tempClass As New UsingClass(Reference)
         tempClass.Reference.BooleanValue = False

         Return (tempClass.Reference.BooleanValue = Reference.BooleanValue)
     End Sub

     Public Shared Sub DoNothing()
          Reference.BooleanValue = True
          Dim someBoolean As Boolean = BooleanCheck

          ' Now Reference.Booleanvalue is "False"
     End Sub

End Class

الآن وظيفة BooleanCheck سوف تعود دائما true, ، على الرغم من أن المرجع مرر إلى الطبقة الجديدة UsingClass "حسب القيمة"، وليس بالرجوع إليها. لذلك لا يتم إصدار نسخة من الفصل، ولكن المتغير المحلي myReference في UsingClass لا تزال المراجع / النقاط إلى الممتلكات Reference في RuntimeOrSomething.

كيف يمكن شرح هذا أناقة؟

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

المحلول

يشير مرجعية إلى مثيل كائن، فهو ليس مثالا لكائن. إن إجراء نسخة من الاتجاهات إلى الكائن لا ينشئ كائنا آخر، فهو يخلق مرجعا آخر يشير أيضا إلى نفس الكائن.

نصائح أخرى

لا أستطيع وضع الكثير من الوقت في هذه الإجابة الآن - الكتابة على قطار مع طفل صغير على ركبتي - لكن لدي اثنين من المقالات التي قد تساعد. لقد كتبوا عن C #، ولكن الشيء نفسه ينطبق على vb.net:

من MSDN.:

إذا قمت بتمرير وسيطة متغيرة حسب القيمة باستخدام الكلمة الأساسية BYVAL، فلا يمكن للإجراء تعديل المتغير نفسه. ومع ذلك، إذا كانت الوسيطة نوع مرجعي، فيمكنك تعديل أعضاء الكائن الذي يشير إليه، على الرغم من أنه لا يمكنك استبدال الكائن نفسه. على وجه الخصوص، يمكنك تعديل أعضاء الكائن. على سبيل المثال، إذا كانت الوسيطة متغير صفيف، فلا يمكنك تعيين صفيف جديد لذلك، ولكن يمكنك تغيير واحد أو أكثر من عناصره. تنعكس العناصر المتغيرة في متغير الصفيف الأساسي في رمز الاتصال.

نظرا لأن التحليم الخاص بك هو نوع مرجعي، إذا قمت بتمريره بواسطة ByVal، فلن تتمكن من استبداله بكائن جديد (لا تفعله)، لكنك يمكنك أن تتجمع مع Inflines لها (التي تقوم بها). ما إذا كنت تمر ByRef أو ByVal، فإن Mucking حولها ستظل "تؤثر" الكائن الأصلي (نظرا لوجود كائن واحد فقط في الذاكرة).

في هذا الخط:

Dim tempClass as New UsingClass(Reference)

الكائن المشار إليه من قبل Reference يتم تمرير الممتلكات "حسب القيمة"، لكنها ليست كذلك هدف التي يتم نسخها، انها ال المرجعي إلى هذا الكائن الذي يتم نسخه (أي التحير المثيرة و Tempclass.Reference هي "مؤشران متميزان" على نفس الكائن. هل يمكنك القيام بذلك tempClass.Reference = new ReferenceClass ثم لا يزال التحير بمحلية وتيمبكلاس.

عند تمرير الفصول الدراسية ByVal / Byref في VB.NET، من الممكن التفكير في الأمر من حيث البرمجة C ومؤشرات ذلك -

ByVal = تمرير الوسائط عبر - ByRef Byref = تمرير الوسائط عبر - مؤشر إلى مؤشر

تأخذ السلاسل كمثال

' ByRef - modify str pointer to "point" to a new string
Sub Test_Ref(ByRef str as string)
    str = "New String ByRef"
End Sub

' ByVal - can't modify str pointer must return a (pointer to) new string
Function Test_Val(ByVal str as String) as String
    Return "New String ByVal"
End Sub

Sub Main()
    Dim strTest as String = "Hello World!"
    Console.WriteLine(strTest)
    Test_Ref(strTest)
    Console.WriteLine(strTest)
    Test_Val(strTest)
    Console.WriteLine(strTest) ' oops still pointing to same string
    strTest = Test_Val(strTest)
    Console.WriteLine(strTest) ' that's better :)
End Sub

مثل القساه أعلاه، تعيين متغير كائن يساوي آخر يضبط فقط "المؤشر" بمثابة الكائن نفسه في الذاكرة، إذا كنت ترغب في استنساخ الكائن ينظر إلى تطبيق واجهة iCloneable مع شيء مثل

Public Function Clone() As Object Implements ICloneable.Clone
Return Me.MemberwiseClone()
End Function

مع وعندما يمكنك تخصيص الكائن استخدام طريقة الاستنساخ

Dim tempClass as ReferenceClass = Reference.Clone
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top