Die Verwirrung hier ist, weil im Gegensatz zu Zeigern (wie in *), „ref“ in C# ist kein Teil eines Typs, sondern ein Teil einer Methodensignatur. Es gilt für den Parameter und bedeutet "dies darf nicht kopiert werden". Es bedeutet nicht "dieses Argument hat Referenztyp".
Parameter, der von ref übergeben wird, anstatt einen neuen Speicherort anzugeben, ist stattdessen ein Alias für einen vorhandenen Speicherort. Wie Alias erstellt wird, ist technisch ein Implementierungsdetail. Meistens werden Aliase als verwaltete Referenzen implementiert, aber nicht immer. In einigen asynchronen verwandten Fällen könnte z. B. eine Referenz auf ein Array-Element intern als eine Kombination aus Array und Index dargestellt werden.
Im Wesentlichen werden Ihre a und b für C# immer noch als int-typisierte Variablen verstanden. Es ist legal und völlig normal, sie in jedem Ausdruck zu verwenden, der int-Werte wie a + b oder SomeMethod (a, b) verwendet, und in diesen Fällen werden die in a und b gespeicherten tatsächlichen int-Werte verwendet.
Es gibt wirklich kein Konzept einer "Referenz" als eine Entität, mit der Sie direkt in C# arbeiten können. Im Gegensatz zu Zeigern muss davon ausgegangen werden, dass die tatsächlichen Werte verwalteter Referenzen jederzeit oder sogar asynchron durch GC geändert werden können, sodass die Menge sinnvoller Szenarien für verwaltete Referenzen äußerst begrenzt wäre.
weil die Referenzen für Werttypen nicht ähnlich sind. –
Der Modifikator 'ref' bewirkt nicht, dass das entsprechende Argument in einen Referenztyp eingereiht wird. – Lee
Versuchen Sie zu sehen, ob die beiden Parameter Verweise auf die gleiche Variable sind? – BoltClock