Estou tentando fazer o seguinte:
GetString(
inputString,
ref Client.WorkPhone)
private void GetString(string inValue, ref string outValue)
{
if (!string.IsNullOrEmpty(inValue))
{
outValue = inValue;
}
}
Isso está me dando um erro de compilação. Eu acho que é bem claro o que estou tentando alcançar. Basicamente eu quero GetString
para copiar o conteúdo de uma cadeia de entrada para a WorkPhone
propriedade de Client
.
É possível passar uma propriedade por referência?
c#
properties
pass-by-reference
yogibear
fonte
fonte
Respostas:
As propriedades não podem ser passadas por referência. Aqui estão algumas maneiras pelas quais você pode solucionar essa limitação.
1. Valor de retorno
2. Delegado
3. Expressão LINQ
4. Reflexão
fonte
code
string estática pública GetValueOrDefault (essa string s, string isNullString) {if (s == null) {s = isNullString; } retornar s; } void Main () {person.MobilePhone.GetValueOrDefault (person.WorkPhone); }getOutput
é desnecessário.GetString
que deve definir uma propriedade é claramente nomeado incorretamente.sem duplicar a propriedade
fonte
GetString
paraNullSafeSet
, porque o primeiro não faz sentido aqui.Eu escrevi um wrapper usando a variante ExpressionTree ec # 7 (se alguém estiver interessado):
E use-o como:
fonte
Se você deseja obter e definir a propriedade, você pode usá-lo no C # 7:
fonte
Outro truque ainda não mencionado é ter a classe que implementa uma propriedade (por exemplo,
Foo
do tipoBar
) também defina um delegadodelegate void ActByRef<T1,T2>(ref T1 p1, ref T2 p2);
e implemente um métodoActOnFoo<TX1>(ref Bar it, ActByRef<Bar,TX1> proc, ref TX1 extraParam1)
(e possivelmente versões para dois e três "parâmetros extras") que passará sua representação interna deFoo
para o procedimento fornecido como umref
parâmetro. Isso tem algumas grandes vantagens sobre outros métodos de trabalho com a propriedade:Passar as coisas
ref
é um excelente padrão; Pena que não é mais usado.fonte
Apenas um pouco de expansão para a solução Linq Expression de Nathan . Use parâmetros multi-genéricos para que a propriedade não se limite à string.
fonte
Isso é abordado na seção 7.4.1 da especificação do idioma C #. Somente uma referência variável pode ser passada como um parâmetro ref ou out em uma lista de argumentos. Uma propriedade não se qualifica como uma referência variável e, portanto, não pode ser usada.
fonte
Isso não é possível. Você poderia dizer
onde
WorkPhone
é umastring
propriedade gravável e a definição deGetString
é alterada paraIsso terá a mesma semântica que você parece estar tentando.
Isso não é possível porque uma propriedade é realmente um par de métodos disfarçados. Cada propriedade disponibiliza getters e setters que são acessíveis por meio de sintaxe do tipo campo. Quando você tenta ligar
GetString
como propôs, o que está passando é um valor e não uma variável. O valor que você está passando é o retorno do getterget_WorkPhone
.fonte
O que você poderia tentar fazer é criar um objeto para armazenar o valor da propriedade. Dessa forma, você pode passar o objeto e ainda ter acesso à propriedade dentro.
fonte
Propriedades não podem ser passadas por referência? Torne-o um campo e use a propriedade para referenciá-lo publicamente:
fonte
Você não pode
ref
uma propriedade, mas se suas funções precisarem de ambosget
e deset
acesso, você pode passar por uma instância de uma classe com uma propriedade definida:Exemplo:
fonte
A resposta aceita é boa se essa função estiver no seu código e você puder modificá-la. Mas, às vezes, você precisa usar um objeto e uma função de alguma biblioteca externa e não pode alterar a definição de propriedade e função. Então você pode apenas usar uma variável temporária.
fonte
Para votar nesta questão, aqui está uma sugestão ativa de como isso pode ser adicionado ao idioma. Não estou dizendo que essa é a melhor maneira de fazer isso (sinta-se), fique à vontade para colocar sua própria sugestão. Mas permitir que as propriedades sejam passadas por ref como o Visual Basic já pode fazer ajudaria enormemente a simplificar algum código, e com bastante frequência!
https://github.com/dotnet/csharplang/issues/1235
fonte