Non è possibile farlo con C#.
È possibile con VB.Net, ma considero questa una cattiva idea. Il seguente codice e l'output mostrano come lo fa e mostra perché penso che sia una cattiva idea, al punto in cui vorrei VB.net, inoltre, non ha permesso questo
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
Ora chiamare questo da un sub principale, in questo modo
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
emette
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
si può vedere che il membro PublicInt
quando passò ByRef
viene aggiornato immediatamente sulla sampleClass, mettere il 012.esposto come una proprietà viene aggiornato solo dopo il termine del metodo IterateAndUpdate
.
Pertanto, si ottiene un comportamento nettamente diverso da esattamente la stessa convenzione di chiamata, e dipende da come hai implementato l'oggetto passato (che non è affatto evidente guardando la chiamata a IterateAndUpdate
.
La possibilità di nascondere bug, o avere piccole modifiche cambiare il comportamento previsto è sufficiente per me desiderare che questa "caratteristica" non esistesse
A mio parere, questo non funziona correttamente, quindi dovrebbe essere
a) Risolto, che richiederebbe uno sforzo considerevole per il team di compilatori e probabilmente introdurrebbe cambiamenti improvvisi
o
b) Non funziona affatto
Cosa dice il compilatore? – flq
@ Frank: Se lo sapessi, perché dovrei fare la domanda? – CJ7