14

有人this在 C# 方法中提供有用的赋值示例吗?我在工作面试中被问过一次,我仍然有兴趣自己回答。

4

6 回答 6

43

当他们说您不能分配给“this”时,其他答案是不正确的。没错,您不能用于类类型,但可以用于结构类型:

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

在任何时候,结构都可以通过分配给“this”来改变自己,就像这样。

于 2008-09-16T07:09:42.703 回答
0

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

通常用于构造函数:

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

在此示例中,我们将参数提供程序分配给私有字段提供程序。

于 2008-09-16T06:44:15.820 回答
-1

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

于 2008-09-16T06:43:50.347 回答
-1

如果你被要求为this分配一些东西,有很多例子。想到的一个是告诉控制他的爸爸是谁:

class frmMain
{
    void InitializeComponents()
    {
        btnOK = new Button();
        btnOK.Parent = this;
    }
}
于 2008-09-16T06:51:43.980 回答
-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这有一个额外的好处,当反序列化新值时,你可以保证一个新的实例,这有时是一个很好的保证!}

于 2014-05-28T14:51:10.963 回答
-2

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

于 2008-09-16T06:38:56.927 回答