Ich versuche Folgendes zu tun:
GetString(
inputString,
ref Client.WorkPhone)
private void GetString(string inValue, ref string outValue)
{
if (!string.IsNullOrEmpty(inValue))
{
outValue = inValue;
}
}
Dies gibt mir einen Kompilierungsfehler. Ich denke, es ist ziemlich klar, was ich erreichen will. Grundsätzlich möchte ich GetString
den Inhalt einer Eingabezeichenfolge in die WorkPhone
Eigenschaft von kopieren Client
.
Ist es möglich, eine Eigenschaft als Referenz zu übergeben?
c#
properties
pass-by-reference
Yogi Bär
quelle
quelle
Antworten:
Eigenschaften können nicht als Referenz übergeben werden. Hier sind einige Möglichkeiten, wie Sie diese Einschränkung umgehen können.
1. Rückgabewert
2. Delegieren
3. LINQ-Ausdruck
4. Reflexion
quelle
code
öffentliche statische Zeichenfolge GetValueOrDefault (diese Zeichenfolge s, Zeichenfolge isNullString) {if (s == null) {s = isNullString; } kehrt zurück; } void Main () {person.MobilePhone.GetValueOrDefault (person.WorkPhone); }getOutput
erforderlich.GetString
, mit der eine Eigenschaft festgelegt werden soll, eindeutig falsch benannt.ohne die Eigenschaft zu duplizieren
quelle
GetString
inNullSafeSet
, da erstere hier keinen Sinn macht.Ich habe einen Wrapper mit der ExpressionTree-Variante und c # 7 geschrieben (wenn jemand interessiert ist):
Und benutze es wie:
quelle
Wenn Sie beide Eigenschaften abrufen und festlegen möchten, können Sie dies in C # 7 verwenden:
quelle
Ein weiterer Trick, der noch nicht erwähnt wurde, besteht darin, dass die Klasse, die eine Eigenschaft (z. B.
Foo
vom TypBar
)delegate void ActByRef<T1,T2>(ref T1 p1, ref T2 p2);
implementiert, auch einen Delegaten definiert und eine MethodeActOnFoo<TX1>(ref Bar it, ActByRef<Bar,TX1> proc, ref TX1 extraParam1)
(und möglicherweise auch Versionen für zwei und drei "zusätzliche Parameter") implementiert, die ihre interne Darstellung vonFoo
an übergibt die mitgelieferte Prozedur alsref
Parameter. Dies hat einige große Vorteile gegenüber anderen Methoden der Arbeit mit der Immobilie:Dinge weiterzugeben
ref
ist ein ausgezeichnetes Muster; Schade, dass es nicht mehr verwendet wird.quelle
Nur eine kleine Erweiterung der Linq Expression-Lösung von Nathan . Verwenden Sie mehrere generische Parameter, damit die Eigenschaft nicht auf Zeichenfolgen beschränkt ist.
quelle
Dies wird in Abschnitt 7.4.1 der C # -Sprachenspezifikation behandelt. In einer Argumentliste kann nur eine Variablenreferenz als ref- oder out-Parameter übergeben werden. Eine Eigenschaft gilt nicht als Variablenreferenz und kann daher nicht verwendet werden.
quelle
Das ist nicht möglich. Du könntest sagen
Wo
WorkPhone
ist eine beschreibbarestring
Eigenschaft und die Definition vonGetString
wird in geändertDies hat dieselbe Semantik, nach der Sie zu suchen scheinen.
Dies ist nicht möglich, da eine Eigenschaft wirklich ein verschleiertes Methodenpaar ist. Jede Eigenschaft stellt Getter und Setter zur Verfügung, auf die über eine feldähnliche Syntax zugegriffen werden kann. Wenn Sie versuchen,
GetString
wie vorgeschlagen aufzurufen , übergeben Sie einen Wert und keine Variable. Der Wert, den Sie übergeben, ist der vom Getter zurückgegebeneget_WorkPhone
.quelle
Sie können versuchen, ein Objekt zu erstellen, das den Eigenschaftswert enthält. Auf diese Weise können Sie das Objekt übergeben und haben dennoch Zugriff auf die darin befindliche Eigenschaft.
quelle
Eigenschaften können nicht als Referenz übergeben werden? Machen Sie es dann zu einem Feld und verwenden Sie die Eigenschaft, um es öffentlich zu referenzieren:
quelle
Sie können keine
ref
Eigenschaft festlegen, aber wenn Ihre Funktionen beidesget
undset
Zugriff benötigen , können Sie eine Instanz einer Klasse mit einer definierten Eigenschaft weitergeben:Beispiel:
quelle
Die akzeptierte Antwort ist gut, wenn diese Funktion in Ihrem Code enthalten ist und Sie sie ändern können. Manchmal müssen Sie jedoch ein Objekt und eine Funktion aus einer externen Bibliothek verwenden, und Sie können die Eigenschafts- und Funktionsdefinition nicht ändern. Dann können Sie einfach eine temporäre Variable verwenden.
quelle
Um über dieses Thema abzustimmen, hier ein aktiver Vorschlag, wie dies der Sprache hinzugefügt werden könnte. Ich sage nicht, dass dies (überhaupt) der beste Weg ist, dies zu tun. Sie können gerne Ihren eigenen Vorschlag machen. Das Zulassen, dass Eigenschaften von ref übergeben werden, wie es Visual Basic bereits kann, würde jedoch erheblich dazu beitragen, Code zu vereinfachen, und das ziemlich oft!
https://github.com/dotnet/csharplang/issues/1235
quelle