C#中“this”赋值的一个例子是什么?

14

有没有关于在C#方法中使用this赋值的有用示例?我曾在一次工作面试中被问到过,现在我仍然对答案感兴趣。

6个回答

46

当其他回答说你不能给'this'赋值时,它们是不正确的。确实,你不能给类类型赋值,但对于结构体类型,你可以

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

任何时候,结构体都可以通过以下方式将自己赋值给“this”来进行修改。


2
哦,这是因为作为结构体,它是值类型,并且赋值运算符=与值类型一起复制值。 - Brian Leahy
启发性的!主观评论:除了Swap(ref struct)场景外,我想不出还有什么可以从中受益的。在分配该结构的所有成员之前,不能使用此方法。我宁愿使用s2 = s1而不是像上面那样使用带有this的方法。 - Gishu
以前也没见过这个 :) - leppie
用C#编程,你永远不必想为什么你喜欢它 - 它总是会提醒你。 - rookie1024

0

使用this关键字可以确保只访问当前类型中作用域内的变量和方法。当字段/属性与局部变量或方法参数之间存在命名冲突时,可以使用此功能。

通常在构造函数中使用:

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

在这个例子中,我们将参数提供者分配给私有字段提供者。

不是将值分配给 this 的示例。 - jnm2

-1
如果你被要求将某个东西分配给“this”,有很多例子。其中一个我想到的是告诉控件谁是他的父亲:
class frmMain
{
    void InitializeComponents()
    {
        btnOK = new Button();
        btnOK.Parent = this;
    }
}

不是将值分配给 this 的示例。 - jnm2

-1

我知道这个问题早已被回答并且讨论停止了,但这里有一个情况我在互联网上没有看到提及过,并且认为在这里分享可能会有用。

我使用它来保持成员的不可变性,同时仍支持序列化。考虑像这样定义的 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的不可变性。这样做的另一个好处是,在反序列化新值时,您可以保证获得一个全新的实例,这有时是一个很好的保证! }


你刚刚创建了一个可变值类型。更糟糕的是,你创建了一个可变值类型,在第一次看起来似乎是不可变的。这是各种邪恶的。 - Servy
我建议明确实现IXmlSerializable接口以获得更多的安全性,但问题是,是否有时候可以拥有一个可序列化的结构体,因为为了可序列化,你需要在某种程度上是可变的。 - mhand

-1

从语法角度来看,唯一正确的位置是在C# 3.0中的扩展方法,当您将方法的第一个参数指定为foo(ftype this, ...)时,然后可以将此扩展用于ftype的任何实例。但这只是语法,而不是真正的this覆盖操作。


不是真的。值类型可以分配给this,并且没有其他语法。 - jnm2

-2

你不能覆盖“this”。它指向当前对象实例。


对于值类型来说,这不是真的。 - jnm2

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接