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 GetStringcopiar el contenido de una cadena de entrada a la WorkPhonepropiedad 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
codecadena estática pública GetValueOrDefault (esta cadena s, cadena isNullString) {if (s == null) {s = isNullString; } devoluciones; } void Main () {person.MobilePhone.GetValueOrDefault (person.WorkPhone); }getOutputes innecesario.GetStringque se supone que establece una propiedad está claramente mal nombrado.sin duplicar la propiedad
fuente
GetStringaNullSafeSet, 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,
Foode 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 deFooa El procedimiento suministrado comorefparámetro. Esto tiene un par de grandes ventajas sobre otros métodos de trabajo con la propiedad:Pasar cosas
refes 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
WorkPhonees unastringpropiedad grabable y la definición deGetStringse 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
GetStringcomo 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
refuna propiedad, pero si sus funciones necesitan ambosgetysetacceso, 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