有没有关于在C#方法中使用this
赋值的有用示例?我曾在一次工作面试中被问到过,现在我仍然对答案感兴趣。
有没有关于在C#方法中使用this
赋值的有用示例?我曾在一次工作面试中被问到过,现在我仍然对答案感兴趣。
当其他回答说你不能给'this'赋值时,它们是不正确的。确实,你不能给类类型赋值,但对于结构体类型,你可以:
public struct MyValueType
{
public int Id;
public void Swap(ref MyValueType other)
{
MyValueType temp = this;
this = other;
other = temp;
}
}
任何时候,结构体都可以通过以下方式将自己赋值给“this”来进行修改。
使用this关键字可以确保只访问当前类型中作用域内的变量和方法。当字段/属性与局部变量或方法参数之间存在命名冲突时,可以使用此功能。
通常在构造函数中使用:
private readonly IProvider provider;
public MyClass(IProvider provider)
{
this.provider = provider;
}
this
的示例。 - jnm2class frmMain
{
void InitializeComponents()
{
btnOK = new Button();
btnOK.Parent = this;
}
}
this
的示例。 - jnm2我知道这个问题早已被回答并且讨论停止了,但这里有一个情况我在互联网上没有看到提及过,并且认为在这里分享可能会有用。
我使用它来保持成员的不可变性,同时仍支持序列化。考虑像这样定义的 struct
:
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
}
由于我们被允许覆盖this
,因此我们可以在单个实例中维护_data
的不可变性。这样做的另一个好处是,在反序列化新值时,您可以保证获得一个全新的实例,这有时是一个很好的保证!
}
从语法角度来看,唯一正确的位置是在C# 3.0中的扩展方法,当您将方法的第一个参数指定为foo(ftype this, ...)时,然后可以将此扩展用于ftype的任何实例。但这只是语法,而不是真正的this覆盖操作。
this
,并且没有其他语法。 - jnm2你不能覆盖“this”。它指向当前对象实例。