المراجع في vb.net.
-
23-08-2019 - |
سؤال
غير واضحة إلى حد ما بالنسبة لي هي المراجع (المؤشرات؟) للفصول في 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