2008-09-16 10 views

Respuesta

42

Las otras respuestas son incorrectas cuando dicen que no se puede asignar a 'esto'. Es cierto que usted puede no para un tipo de clase, pero se puede para un tipo de estructura:

public struct MyValueType 
{ 
    public int Id; 
    public void Swap(ref MyValueType other) 
    { 
     MyValueType temp = this; 
     this = other; 
     other = temp; 
    } 
} 

En cualquier punto de una estructura puede modificarse a sí mismo mediante la asignación a 'esto' como tal.

+7

aprender algo nuevo todos los días ... –

+1

Ohhh es porque como struct es un tipo de valor y el operador de asignación = con tipos de valores copia los valores. –

+0

iluminador!Comentario subjetivo: sin embargo, aparte del escenario Swap (ref struct), no puedo pensar en ninguna otra cosa que pueda beneficiarse de esto. esto no se puede usar antes de asignar todos los miembros de esa estructura. Prefiero usar el s2 = s1 en lugar de tener un método con este usado como el anterior. – Gishu

-1

No es posible sobrescribir "este". Apunta a la instancia del objeto actual.

+0

No es cierto para los tipos de valor. – jnm2

-1

lugar sólo es correcto para este punto de vista de la sintaxis, es Los métodos de extensión en C# 3.0 cuando se especifica primer parámetro del método foo (ftype esto, ...). y luego puede usar esta extensión para cualquier instancia de ftype. Pero es solo una sintaxis y no es real esta operación adicional.

+0

No es cierto. Los tipos de valores pueden asignarse a 'this' y no hay otra sintaxis para él. – jnm2

0

utilizando esta palabra clave garantiza que solo se acceda a las variables y métodos con ámbito en el tipo actual. Esto se puede usar cuando tiene un conflicto de nomenclatura entre un campo/propiedad y una variable local o parámetro de método.

usa típicamente en constructores:

private readonly IProvider provider; 
public MyClass(IProvider provider) 
{ 
    this.provider = provider; 
} 

En este ejemplo asignamos el proveedor de parámetro para el proveedor ámbito privado.

+0

No es un ejemplo de asignación a 'this'. – jnm2

-1

si le piden que asigne algo al este, hay bastantes ejemplos. Uno que viene a la mente es decirle a un control quién es su padre:

class frmMain 
{ 
    void InitializeComponents() 
    { 
     btnOK = new Button(); 
     btnOK.Parent = this; 
    } 
} 
+0

No es un ejemplo de asignación a 'this'. – jnm2

-1

"this" es una referencia a la instancia de la clase actual. Si usted tiene un método no estático en una clase, puede hacer referencia a la instancia de clase actual utilizando la siguiente:

public class MyClass{ 

     public string SomeProperty {get;set;} 
     public void GetSomeProperty(){ 
     return this.SomeProperty; 
     } 

} 
+0

No es un ejemplo de asignación a 'this'. – jnm2

-1

Sé que esta pregunta ha sido contestada y la discusión se ha detenido, pero aquí es un caso que no vi mencionado en cualquier lugar de la interwebs y pensé que podría ser útil para compartir aquí.

He utilizado este para mantener la inmutabilidad de los miembros al mismo tiempo el apoyo a la serialización. Considere un struct se define así:

public struct SampleStruct : IXmlSerializable 
{ 
    private readonly int _data; 

    public int Data { get { return _data; } } 

    public SampleStruct(int data) 
    { 
     _data = data; 
    } 

    #region IXmlSerializableMembers 

    public XmlSchema GetSchema() { return null; } 

    public void ReadXml(XmlReader reader) 
    { 
     this = new SampleStruct(int.Parse(reader.ReadString())); 
    } 

    public void WriteXml(XmlWriter writer 
    { 
     writer.WriteString(data.ToString()); 
    } 

    #endregion 
} 

Dado que se nos permite sobrescribir this, podemos mantener la inmutabilidad de _data celebrada en una única instancia. Esto tiene el beneficio adicional de que al deserializar nuevos valores se garantiza una nueva instancia, que a veces es una buena garantía. }

+0

Acabas de crear un tipo de valor mutable. Y, lo que es peor, crea un tipo de valor mutable que * aparece * como si fuera inmutable a primera vista. Esto es todo tipo de maldad. – Servy

+0

Recomendaría implementar explícitamente la interfaz IXmlSerializable para un poco más de seguridad, pero luego surge la pregunta: ¿está bien tener una estructura serializable, ya que para ser serializable debe ser mutable en algún sentido? – mhand