Я пытаюсь сделать следующее:
GetString(
inputString,
ref Client.WorkPhone)
private void GetString(string inValue, ref string outValue)
{
if (!string.IsNullOrEmpty(inValue))
{
outValue = inValue;
}
}
Это дает мне ошибку компиляции. Я думаю, довольно ясно, чего я пытаюсь достичь. В основном я хочу GetString
скопировать содержимое входной строки в WorkPhone
свойство Client
.
Можно ли передать недвижимость по ссылке?
c#
properties
pass-by-reference
yogibear
источник
источник
Ответы:
Свойства не могут быть переданы по ссылке. Вот несколько способов обойти это ограничение.
1. Возвращаемое значение
2. Делегат
3. LINQ Expression
4. Отражение
источник
code
публичная статическая строка GetValueOrDefault (эта строка s, строка isNullString) {if (s == null) {s = isNullString; } вернуть s; } void Main () {person.MobilePhone.GetValueOrDefault (person.WorkPhone); }getOutput
не нужен.GetString
который должен установить свойство, явно неправильно назван.без дублирования собственности
источник
GetString
наNullSafeSet
, потому что первое здесь не имеет смысла.Я написал обертку, используя вариант ExpressionTree и c # 7 (если кому-то интересно):
И используйте это как:
источник
Если вы хотите получить и установить свойство как, вы можете использовать это в C # 7:
источник
Еще одна хитрость, которая еще не упомянута, заключается в том, чтобы класс, который реализует свойство (например,
Foo
типаBar
), также определял делегатdelegate void ActByRef<T1,T2>(ref T1 p1, ref T2 p2);
и реализовывал методActOnFoo<TX1>(ref Bar it, ActByRef<Bar,TX1> proc, ref TX1 extraParam1)
(и, возможно, версии для двух и трех «дополнительных параметров»), который передаст свое внутреннее представлениеFoo
в предоставленная процедура какref
параметра. Это имеет пару больших преимуществ перед другими методами работы со свойством:Проходящие вещи быть
ref
отличным образцом; Жаль, что он не используется больше.источник
Просто небольшое расширение к решению Натана Linq Expression . Используйте универсальный параметр multi, чтобы свойство не ограничивалось строкой.
источник
Это описано в разделе 7.4.1 спецификации языка C #. В качестве параметра ref или out в списке аргументов может быть передана только ссылка на переменную. Свойство не квалифицируется как ссылка на переменную и, следовательно, не может быть использовано.
источник
Это невозможно. Ты мог бы сказать
где свойство
WorkPhone
доступно для записиstring
и определениеGetString
изменено наЭто будет иметь ту же семантику, которую вы, похоже, пытаетесь найти.
Это невозможно, потому что свойство - это действительно замаскированная пара методов. Каждое свойство делает доступными методы получения и установки, доступные через полевой синтаксис. Когда вы пытаетесь позвонить
GetString
пытаетесь как вы предложили, вы передаете значение, а не переменную. Значение, которое вы передаете, - это то, что возвращается из получателяget_WorkPhone
.источник
То, что вы можете попытаться сделать, это создать объект для хранения значения свойства. Таким образом, вы можете передать объект и по-прежнему иметь доступ к свойству внутри.
источник
Свойства не могут быть переданы по ссылке? Затем сделайте это поле и используйте свойство для публичной ссылки на него:
источник
Вы не можете
ref
иметь свойство, но если вашим функциям нужны обаget
иset
доступ, вы можете передать экземпляр класса с определенным свойством:Пример:
источник
Принятый ответ хорош, если эта функция есть в вашем коде, и вы можете ее изменить. Но иногда вам приходится использовать объект и функцию из какой-то внешней библиотеки, и вы не можете изменить определение свойства и функции. Тогда вы можете просто использовать временную переменную.
источник
Чтобы проголосовать по этому вопросу, вот одно активное предложение о том, как это можно добавить к языку. Я не говорю, что это лучший способ сделать это (вообще), не стесняйтесь выдвигать свое собственное предложение. Но разрешение свойств, передаваемых ref как Visual Basic, уже может сделать, очень помогло бы упростить некоторый код, и довольно часто!
https://github.com/dotnet/csharplang/issues/1235
источник