Próbuję wykonać następujące czynności:
GetString(
inputString,
ref Client.WorkPhone)
private void GetString(string inValue, ref string outValue)
{
if (!string.IsNullOrEmpty(inValue))
{
outValue = inValue;
}
}
To daje mi błąd kompilacji. Myślę, że to całkiem jasne, co próbuję osiągnąć. Zasadniczo chcę GetString
skopiować zawartość ciągu wejściowego do WorkPhone
właściwości Client
.
Czy można przekazać właściwość przez referencję?
c#
properties
pass-by-reference
Miś Yogi
źródło
źródło
Odpowiedzi:
Właściwości nie mogą być przekazywane przez odwołanie. Oto kilka sposobów obejścia tego ograniczenia.
1. Wartość zwracana
2. Deleguj
3. Wyrażenie LINQ
4. Refleksja
źródło
code
publiczny ciąg statyczny GetValueOrDefault (ten ciąg s, ciąg isNullString) {if (s == null) {s = isNullString; } zwroty; } void Main () {person.MobilePhone.GetValueOrDefault (person.WorkPhone); }getOutput
jest niepotrzebny.GetString
która ma ustawić właściwość, jest wyraźnie źle nazwana.bez powielania właściwości
źródło
GetString
naNullSafeSet
, ponieważ ta pierwsza nie ma tutaj sensu.Napisałem opakowanie używając wariantu ExpressionTree ic # 7 (jeśli ktoś jest zainteresowany):
I używaj go w następujący sposób:
źródło
Jeśli chcesz uzyskać i ustawić właściwość zarówno, możesz użyć tego w C # 7:
źródło
Inną sztuczką, o której jeszcze nie wspomniano, jest to, aby klasa, która implementuje właściwość (np.
Foo
TypuBar
), również zdefiniowała delegatadelegate void ActByRef<T1,T2>(ref T1 p1, ref T2 p2);
i zaimplementowała metodęActOnFoo<TX1>(ref Bar it, ActByRef<Bar,TX1> proc, ref TX1 extraParam1)
(ewentualnie wersje również dla dwóch i trzech „dodatkowych parametrów”), która przekaże swoją wewnętrzną reprezentacjęFoo
do dostarczona procedura jakoref
parametr. Ma to kilka dużych zalet w porównaniu z innymi metodami pracy z nieruchomością:Przekazywanie rzeczy
ref
jest doskonałym wzorcem; szkoda, że nie jest więcej używany.źródło
Tylko małe rozszerzenie do rozwiązania Nathan Linq Expression . Użyj wielu ogólnych parametrów, aby właściwość nie ograniczała się do łańcucha.
źródło
Jest to omówione w sekcji 7.4.1 specyfikacji języka C #. Tylko odwołanie do zmiennej można przekazać jako parametr ref lub out na liście argumentów. Właściwość nie kwalifikuje się jako odwołanie do zmiennej i dlatego nie można jej użyć.
źródło
To jest niemożliwe. Można powiedzieć
gdzie
WorkPhone
jeststring
właściwość do zapisu i zmieniono definicjęGetString
naBędzie to miało tę samą semantykę, o którą się starasz.
Nie jest to możliwe, ponieważ właściwość jest naprawdę parą ukrytych metod. Każda właściwość udostępnia obiekty pobierające i ustawiające, które są dostępne poprzez składnię polową. Gdy próbujesz zadzwonić
GetString
zgodnie z propozycją, przekazujesz wartość, a nie zmienną. Przekazywana wartość to wartość zwracana przez moduł pobierającyget_WorkPhone
.źródło
Możesz spróbować utworzyć obiekt, w którym będzie przechowywana wartość właściwości. W ten sposób możesz przekazać obiekt i nadal mieć dostęp do nieruchomości w środku.
źródło
Właściwości nie mogą być przekazywane przez odwołanie? Uczyń go więc polem i użyj właściwości, aby odwoływać się do niego publicznie:
źródło
Nie możesz mieć
ref
właściwości, ale jeśli twoje funkcje potrzebują obuget
iset
dostępu, możesz przekazać instancję klasy ze zdefiniowaną właściwością:Przykład:
źródło
Przyjęta odpowiedź jest dobra, jeśli ta funkcja znajduje się w kodzie i można ją zmodyfikować. Ale czasami trzeba użyć obiektu i funkcji z jakiejś zewnętrznej biblioteki i nie można zmienić definicji właściwości i funkcji. Następnie możesz po prostu użyć zmiennej tymczasowej.
źródło
Aby głosować w tej sprawie, oto jedna aktywna sugestia, w jaki sposób można ją dodać do języka. Nie twierdzę, że jest to najlepszy sposób na zrobienie tego (w ogóle), zachęcamy do przedstawienia własnych sugestii. Ale zezwolenie na przekazywanie właściwości przez referencje, jak to już robi Visual Basic, znacznie pomogłoby uprościć niektóre kody i dość często!
https://github.com/dotnet/csharplang/issues/1235
źródło