ParametreInfo.ParameterType.IsByRef, parametrenin bildirimi ByRef anahtar sözcüğüyle doğruysa ve bildirimin ByVal anahtar sözcüğüyle olması durumunda false değerini döndürür (parametrenin türünün değere göre olup olmadığına bakılmaksızın) yapı) veya referans (ör., sınıf)).
' Empty structure and class, just for illustration.
Public Structure MyStruct
End Structure
Public Class MyClass1
End Class
Ve (siz ByVal alır aşağıdaki yöntemi var ve yukarıda tanımlanan yapı ve sınıf için argümanlar ByRef varsayalım: göstermek için
(I VB kodu kullanıyorum) aşağıdaki yapıyı ve sınıfı dikkate
Public Sub P(s1 As MyStruct, ByRef s2 As MyStruct, c1 As MyClass1, ByRef c2 As MyClass1)
End Sub
Şimdi aşağıdaki kod ParameterInfo.ParameterType.IsByRef yöntemini test eder:
varsayılan) olduğu gibi VB 2012 ile başlayarak, ByVal anahtar atlayabilirsiniz unutmayın
Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
' Reflect on method P:
Dim mi As MethodInfo = Me.GetType.GetMethod("P")
' Iterate all parameters, and call its ParameterType.IsByRef method:
For Each pi As ParameterInfo In mi.GetParameters
If **pi.ParameterType.IsByRef** _
Then Console.WriteLine(pi.Name & " is ByRef") _
Else Console.WriteLine(pi.Name & " is ByVal")
Next
End Sub
Aşağıdaki çıktıyı alırsınız:, onlar ByRef anahtar sözcüğü ile tanımlanır çünkü
s1 is ByVal
s2 is ByRef
c1 is ByVal
c2 is ByRef
Gördüğünüz gibi, ParameterInfo.ParameterType.IsByRef argümanlar s2 ve c2 için de geçerlidir döndüren halde bir bunlar bir yapıdır (değer tipi) ve diğeri bir sınıftır (referans tipi); ve ByVal anahtar sözcüğüyle tanımlanan argümanlar için false döndürür. Bununla birlikte, ByVal anahtar sözcüğünün tüm argümanların bir kopya olarak iletileceği anlamına gelmediğini unutmayın. Bu anahtar kelime (ByVal) kullanılsa bile, eğer tür by-reference (ör., Sınıf) ise, argüman ByRef anahtar sözcüğü kullanılmış gibi referans olarak iletilir. Yani, yukarıdaki P metodunun c1 ve c2'si, BOTH referans ile geçirilecektir, yani P bir alanı veya özelliği c1 veya c2 olarak değiştirirse, değişiklikler arayana yansıtılacaktır. (ByVal ve ByRef tipi, bir yapı olarak, bir değer, çoğunlukla fark.)
de
parameterInfo.ParameterType.IsByRef
, @Patrik Hägne dikkat eğer sonra bir gerekmeyebilir. IsOut, parametrenin referans olarak geçtiği anlamına da gelmez. Yani, parametrenin bir "çıkış" parametresi olduğu anlamına gelmez. Yakın zamanda keşfettiğim gibi, çok şükürlerime. –@BlairConrad: Yukarıdaki yorumunuzu detaylandırır mısınız? IsOut hangi durumlarda paramın bir "çıkış" parametresi olduğu anlamına gelmez? – RobSiklos
@RobSiklos, elbette. Sordid öyküsü [FakeItEasy issue 508'deki bir yorum] bölümünde anlatılmıştır (https://github.com/FakeItEasy/FakeItEasy/issues/508#issuecomment-122147155). Bazı parametreler 'Out]' ile dekore edilmiştir. Örneğin, Stream.Read (byte [], int, int) 'deki arabellek. –