Estoy tratando de hacer lo siguiente:
GetString(
inputString,
ref Client.WorkPhone)
private void GetString(string inValue, ref string outValue)
{
if (!string.IsNullOrEmpty(inValue))
{
outValue = inValue;
}
}
Esto me está dando un error de compilación. Creo que está bastante claro lo que estoy tratando de lograr. Básicamente quiero GetString
copiar el contenido de una cadena de entrada a la WorkPhone
propiedad de Client
.
¿Es posible pasar una propiedad por referencia?
c#
properties
pass-by-reference
oso Yogi
fuente
fuente
Respuestas:
Las propiedades no se pueden pasar por referencia. Aquí hay algunas maneras en que puede solucionar esta limitación.
1. Valor de retorno
2. Delegado
3. Expresión LINQ
4. Reflexión
fuente
code
cadena estática pública GetValueOrDefault (esta cadena s, cadena isNullString) {if (s == null) {s = isNullString; } devoluciones; } void Main () {person.MobilePhone.GetValueOrDefault (person.WorkPhone); }getOutput
es innecesario.GetString
que se supone que establece una propiedad está claramente mal nombrado.sin duplicar la propiedad
fuente
GetString
aNullSafeSet
, porque el primero no tiene sentido aquí.Escribí un contenedor usando la variante ExpressionTree y c # 7 (si alguien está interesado):
Y úsalo como:
fuente
Si desea obtener y establecer la propiedad de ambos, puede usar esto en C # 7:
fuente
Otro truco que aún no se menciona es que la clase que implementa una propiedad (por ejemplo,
Foo
de tipoBar
) también defina un delegadodelegate void ActByRef<T1,T2>(ref T1 p1, ref T2 p2);
e implemente un métodoActOnFoo<TX1>(ref Bar it, ActByRef<Bar,TX1> proc, ref TX1 extraParam1)
(y posiblemente versiones para dos y tres "parámetros adicionales" también) que pasarán su representación interna deFoo
a El procedimiento suministrado comoref
parámetro. Esto tiene un par de grandes ventajas sobre otros métodos de trabajo con la propiedad:Pasar cosas
ref
es un patrón excelente; Lástima que no se use más.fuente
Solo una pequeña expansión a la solución de expresión Linq de Nathan . Utilice el parámetro multi genérico para que la propiedad no se limite a la cadena.
fuente
Esto está cubierto en la sección 7.4.1 de la especificación del lenguaje C #. Solo se puede pasar una referencia de variable como parámetro ref o out en una lista de argumentos. Una propiedad no califica como referencia variable y, por lo tanto, no se puede usar.
fuente
Esto no es posible. Tu puedes decir
donde
WorkPhone
es unastring
propiedad grabable y la definición deGetString
se cambia aEsto tendrá la misma semántica que parece estar intentando.
Esto no es posible porque una propiedad es realmente un par de métodos disfrazados. Cada propiedad pone a disposición getters y setters a los que se puede acceder mediante una sintaxis similar a un campo. Cuando intentas llamar
GetString
como has propuesto, lo que estás pasando es un valor y no una variable. El valor que está pasando es el que devuelve el captadorget_WorkPhone
.fuente
Lo que podría intentar hacer es crear un objeto para mantener el valor de la propiedad. De esa manera, podría pasar el objeto y aún tener acceso a la propiedad dentro.
fuente
¿Las propiedades no se pueden pasar por referencia? Conviértalo en un campo y use la propiedad para hacer referencia públicamente:
fuente
No puede
ref
una propiedad, pero si sus funciones necesitan ambosget
yset
acceso, puede pasar una instancia de una clase con una propiedad definida:Ejemplo:
fuente
La respuesta aceptada es buena si esa función está en su código y puede modificarla. Pero a veces tiene que usar un objeto y una función de una biblioteca externa y no puede cambiar la propiedad y la definición de la función. Entonces puedes usar una variable temporal.
fuente
Para votar sobre este tema, aquí hay una sugerencia activa de cómo esto podría agregarse al idioma. No estoy diciendo que esta sea la mejor manera de hacer esto (en absoluto), siéntase libre de presentar su propia sugerencia. Pero permitir que las propiedades pasen por referencia como lo puede hacer Visual Basic ayudaría enormemente a simplificar algo de código, ¡y con bastante frecuencia!
https://github.com/dotnet/csharplang/issues/1235
fuente