No puede hacer esto con C#.
Puedes con VB.Net, pero considero que es una mala idea. El siguiente código y de salida muestran cómo lo hace y muestra por qué creo que es una mala idea, hasta el punto que me gustaría también VB.net no permitió que esta
Public Class MySimpleClass
Private _privateInt As Integer
Public PublicInt As Integer
Public Property PrivateInt() As Integer
Get
Return _privateInt
End Get
Set(ByVal value As Integer)
_privateInt = value
End Set
End Property
Public Sub MyNotifier()
Console.WriteLine("PublicInt {0} : PrivateInt {1} : Values are not the same", PublicInt, PrivateInt)
End Sub
End Class
Ahora llaman a esto de una sub principal, al igual que
Sub Main()
Dim sampleClass As New MySimpleClass
IterateAndUpdate(sampleClass.PrivateInt, sampleClass.PublicInt, AddressOf sampleClass.MyNotifier)
Console.WriteLine("Private {0} : Public {0} : values are the same ", sampleClass.PrivateInt, sampleClass.PublicInt)
Console.ReadKey()
End Sub
Sub IterateAndUpdate(ByRef anInt As Integer, ByRef anOtherInt As Integer, ByVal notifier As Action)
For i As Integer = 1 To 9
anInt = i
anOtherInt = i
notifier()
Next
End Sub
Esto da salida a
PublicInt 1 : PrivateInt 0 : Values are not the same
PublicInt 2 : PrivateInt 0 : Values are not the same
PublicInt 3 : PrivateInt 0 : Values are not the same
PublicInt 4 : PrivateInt 0 : Values are not the same
PublicInt 5 : PrivateInt 0 : Values are not the same
PublicInt 6 : PrivateInt 0 : Values are not the same
PublicInt 7 : PrivateInt 0 : Values are not the same
PublicInt 8 : PrivateInt 0 : Values are not the same
PublicInt 9 : PrivateInt 0 : Values are not the same
Private 9 : Public 9 : values are the same
se puede ver que el miembro PublicInt
cuando pasó ByRef
se actualiza inmediatamente en SampleClass, poner elexpuesto como propiedad solo se actualiza después de que finaliza el método IterateAndUpdate
.
Por lo tanto, se obtiene un comportamiento marcadamente diferente de exactamente la misma convención de llamada, y depende de cómo se ha implementado el elemento pasó (que no es en absoluto evidente mirando la llamada a IterateAndUpdate
.
El potencial de ocultar errores, o tienen pequeños cambios cambian el comportamiento esperado es suficiente para que yo deseo esta "característica" que no existía.
en mi opinión esto no funciona correctamente, por lo que debe ser o bien
a) fijo, que tomaría un esfuerzo considerable para el equipo del compilador, y posiblemente introduzca cambios de rotura
o
b) No funciona en absoluto
¿Qué dice el compilador? – flq
@Frank: Si lo supiera, ¿por qué haría la pregunta? – CJ7