这两个相似的代码块有什么区别?

时间:2010-07-17 19:16:59

标签: c# .net

有什么区别:

public class Person
{
    public string Name { get; set; }

    public Person(string name)
    {
        this.Name = name;
    }
}



public class Person
{
    public string Name { get; set; }

    public Person(string name)
    {
        Name = name;
    }
}

他们俩都不做同样的事吗?

谢谢。

10 个答案:

答案 0 :(得分:12)

是的,他们这样做。在第二个代码示例中,“this”是隐含的。当你使用“这个”。你更明确地说你指的是一个实例成员。

有时您需要使用this关键字。例如:

public class Person
{
    public string name;

    public Person(string name)
    {
        this.name = name;
    }
}

如果没有“this”,编译器就不会知道你的意思是实例字段。

答案 1 :(得分:10)

没有区别;他们都做同样的事情,并编译成相同的IL。

我个人更喜欢使用表格

this.Name = name;

...澄清我的意图。如果参数的名称与成员字段(套管和全部)相同,那么您 使用this来消除您指的是哪一个。

答案 2 :(得分:2)

是的,他们都做同样的事情,但使用“this”明确指出你正在处理类http://msdn.microsoft.com/en-us/library/dk1507sz(VS.71).aspx的当前实例

“this”可以让你对会员进行资格认证,特别是当他们相同时很有用。

this.name = name;

答案 3 :(得分:1)

他们的确如此。这是一个品味问题。有些人喜欢说“嘿看我正在和一个成员变量说话!故意!”。有些人有触发智能感知的习惯。编译器不关心您是否键入它。在某些奇怪的情况下,你在不同的范围内有相同名称的变量,你需要this.来清楚说明,但你的例子不是这种情况之一。

答案 4 :(得分:1)

是的,从语义上讲,这两段代码完全相同。

第一个版本的原因是将this放在构造函数中的类成员前面是很常见的,因为通常构造函数参数名称与成员名称相同,{{1}必须用它来区分它们。由于此属性的后备存储是自动生成的,并且没有定义私有字段成员,因此名称具有不同的大小写,因此不需要this

this

答案 5 :(得分:1)

您展示的两段代码也做同样的事情。

但是,如果你有这个,那就不一样了:

public class Person
{
    public string Name { get; set; }

    public Person(string name)
    {
        String Name;

        this.Name = name;
    }
}

请注意具有相同标识符的局部变量。许多人明确使用this来引用成员变量以提高可读性,并避免出现上述情况。

答案 6 :(得分:0)

是的他们做同样的事情。

答案 7 :(得分:0)

是的他们做同样的事情。

除了澄清你正在处理类的实例并将字段与参数区分开来之外,当你使用它然后点击点时你也会获得一些intellisense的好处。

您可能遇到的另一个品味问题是通过在字段前面添加下划线而不使用此字符来区分字段和参数,如:

_name = name;

此约定对Intellisense也很有用,因为您知道您将在列表顶部找到所有私有字段。

最后,在您的属性中使用私有 setter并完全取消支持字段并不罕见,如:

public string Name { get; private set; }

public Person(string name)
{
    Name = name;
}

这会给我们带来一个完整的圆圈到this运算符,如果在Name(this.Name)前面使用它将编译成完全相同的东西。

个人的味道是不要使用它,因为我发现这样做很吵(如果我需要它来区分一件事我肯定搞砸了别的东西)。很多编写非常优雅代码的人都会使用它。

HTH,
Berryl

答案 8 :(得分:0)

作为补充:

即使他们这样做,我建议使用公共属性作为私有成员的接口,因为内部引用始终使用私有字段名称。

答案 9 :(得分:0)

他们编译相同,但有一点你会注意到,在VC#中,如果输入“this”,IntelliSense将为您提供相关字段/属性的列表。第一。鉴于您输入的速度相当快,我认为输入“this”。最终为你节省了一些思考时间。