2010-07-17 73 views
2

之间有什么区别:这两个类似的代码块有什么区别?

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; 
    } 
} 

难道他们都不会做同样的事情?

谢谢。

+3

如果C#和PHP一样,第一个会改变类变量,第二个会简单地在该函数内设置一个Name变量,一旦函数完成,它就会消失。 – animuson 2010-07-17 19:20:13

+3

很高兴知道不同的语言在类似的情况下做了不同的事情。这就是为什么它是一个评论,这只是额外的信息。 – animuson 2010-07-17 19:22:03

回答

12

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

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

public class Person 
{ 
    public string name; 

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

如果没有“this”,编译器就不会知道您是指实例字段。

10

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

我个人更喜欢使用形式

this.Name = name; 

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

0

是的,他们做同样的事情。

1

他们的确的确如此。这是一个品味问题。有些人喜欢说:“嘿,看我在和一个成员变量交谈!故意!”。有些人有触发intellisense的习惯。编译器不关心你是否输入。在一些奇怪的情况下,如果变量名称在不同范围内,则需要使用this.来表示,但您的示例不属于这些情况之一。

1

是的,在语义上这两段代码是相同的。

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

public class Person 
{ 
    private string name; 
    public string Name { get { return name; } set { name = value; } } 

    public Person(string name) 
    { 
     this.name = name; // "this" is required in this case. 
    } 
} 
1

您显示的两段代码执行的操作相同。

但是,如果你有这一点,这将是不同的:

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

    public Person(string name) 
    { 
     String Name; 

     this.Name = name; 
    } 
} 

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

0

是的,他们做同样的事情。

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

的味道的另一个问题是,你可能会遇到是由该领域的正面前缀下划线,而不是使用该领域从参数区分,如:

_name = name; 

这种约定也是有用如您所知,您将在列表顶部找到所有私有字段。

最后,它是不是在所有少见你的财产使用私人 setter和完全消除的支持字段,如:

public string Name { get; private set; } 

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

这将使我们大圈到该运营商,如果在Name(this.Name)前面使用它将编译成完全相同的东西。

我的个人味道是不使用这个,因为我觉得这样做很嘈杂(如果我需要它来区分一件事与另一件事我肯定已经拧了别的东西了)。很多编写非常优雅的代码的人会使用它。

HTH,
Berryl

0

的加成:

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

0

它们的编译方式是一样的,但有一点你会注意到,在VC#中,如果输入“this”,IntelliSense会给你一个相关字段/属性的列表。第一。鉴于你打字速度合理,我认为输入“这个”。最终为您节省一点思考时间。