Constructor C中“this.”关键字的正确用法?
我正在阅读Head First C这本书,到目前为止进展顺利,但我在理解使用this所涉及的语法时遇到了很多困难。关键词 从概念上讲,我知道我应该使用它来避免参数屏蔽同名字段,但是我在通过示例跟踪它时遇到了困难,他们似乎没有专门针对特定关键字的部分,他们只是解释它并开始在示例中使用它 有没有人在应用这一点时有什么好的经验法则。?或者任何在线教程,以不同的方式解释它,头一个C 谢谢 这是我写的。当且仅当它增强可读性时,例如,在实现可比较的Java接口时,但其思想是相同的:Constructor C中“this.”关键字的正确用法?,constructor,parameters,field,this,keyword,Constructor,Parameters,Field,This,Keyword,我正在阅读Head First C这本书,到目前为止进展顺利,但我在理解使用this所涉及的语法时遇到了很多困难。关键词 从概念上讲,我知道我应该使用它来避免参数屏蔽同名字段,但是我在通过示例跟踪它时遇到了困难,他们似乎没有专门针对特定关键字的部分,他们只是解释它并开始在示例中使用它 有没有人在应用这一点时有什么好的经验法则。?或者任何在线教程,以不同的方式解释它,头一个C 谢谢 这是我写的。当且仅当它增强可读性时,例如,在实现可比较的Java接口时,但其思想是相同的: public void
public void compareTo(MyClass other) {
if (this.someField > other.someField) return 1;
if (this.someField < other.someField) return -1;
return 0;
}
我写这个。当且仅当它增强可读性时,例如,在实现可比较的Java接口时,但其思想是相同的:
public void compareTo(MyClass other) {
if (this.someField > other.someField) return 1;
if (this.someField < other.someField) return -1;
return 0;
}
就我个人而言,我只在必要时使用它,即: 构造函数链接:
public Foo(int x) : this(x, null)
{
}
public Foo(int x, string name)
{
...
}
从一个参数名复制到一个字段中不像在Java中那样常见,因为您通常使用一个属性-但在构造函数中很常见
public void SetName(string name)
{
// Just "name = name" would be no-op; within this method,
// "name" refers to the parameter, not the field
this.name = name;
}
在不涉及任何成员的情况下提及该对象:
Console.WriteLine(this);
声明扩展方法:
public static TimeSpan Days(this int days)
{
return TimeSpan.FromDays(days);
}
其他一些人总是使用它,例如,用于其他方法调用-我个人认为这会使事情变得有点混乱。我个人只在必要时使用它,这是: 构造函数链接:
public Foo(int x) : this(x, null)
{
}
public Foo(int x, string name)
{
...
}
从一个参数名复制到一个字段中不像在Java中那样常见,因为您通常使用一个属性-但在构造函数中很常见
public void SetName(string name)
{
// Just "name = name" would be no-op; within this method,
// "name" refers to the parameter, not the field
this.name = name;
}
在不涉及任何成员的情况下提及该对象:
Console.WriteLine(this);
声明扩展方法:
public static TimeSpan Days(this int days)
{
return TimeSpan.FromDays(days);
}
其他一些人总是使用它,例如,用于其他方法调用-我个人发现它有点混乱。基本上,这提供了对当前对象的引用。您可以使用它访问对象上的成员,或者将当前对象作为参数传递给其他方法
在几乎所有情况下,在访问成员变量或方法调用之前放置它是完全没有必要的,尽管一些样式指南出于各种原因建议使用它
就我个人而言,我确保我命名的成员变量与我的参数明显不同,以避免使用“this”。例如:
private String _someData;
public String SomeData
{
get{return _someData;}
set{_someData = value;}
}
不过,这在很大程度上是个人偏好,有些人会建议您将属性和成员变量命名为相同的大小写差异—“someData”和“someData”,并在访问私有成员时使用this关键字来表示差异
作为经验法则,避免使用它。如果您发现自己使用它来区分局部/参数变量和成员变量,那么请重命名其中一个,这样您就不必使用“this”
我将使用它的情况是多个构造函数,传递对其他方法和扩展方法的引用。有关示例,请参见。基本上,这提供了对当前对象的引用。您可以使用它访问对象上的成员,或者将当前对象作为参数传递给其他方法
在几乎所有情况下,在访问成员变量或方法调用之前放置它是完全没有必要的,尽管一些样式指南出于各种原因建议使用它
就我个人而言,我确保我命名的成员变量与我的参数明显不同,以避免使用“this”。例如:
private String _someData;
public String SomeData
{
get{return _someData;}
set{_someData = value;}
}
不过,这在很大程度上是个人偏好,有些人会建议您将属性和成员变量命名为相同的大小写差异—“someData”和“someData”,并在访问私有成员时使用this关键字来表示差异
作为经验法则,避免使用它。如果您发现自己使用它来区分局部/参数变量和成员变量,那么请重命名其中一个,这样您就不必使用“this”
我将使用它的情况是多个构造函数,传递对其他方法和扩展方法的引用。请参见示例的默认编码样式强制执行以下规则:
A1101:对{方法或属性的调用
名称}必须以“this”开头
前缀,指示该项是一个
班上的一员
这意味着属于当前类的每个方法、字段和属性都将以该前缀作为前缀。我最初反对这条规则,因为它会让你的代码更加冗长,但从那以后,它就对我产生了影响,因为它让代码变得非常清晰 的默认编码样式强制执行以下规则:
A1101:对{方法或属性的调用
名称}必须以“this”开头
前缀,指示该项是一个
班上的一员
这意味着属于当前类的每个方法、字段和属性都将以该前缀作为前缀。我最初对t有抵抗力
他的规则,使你的代码更加冗长,但从那以后,它就对我产生了影响,因为它使代码变得非常清晰 如果类中有使用同一类字段的方法,则可以使用此方法
public class FullName
{
public string fn { set; get; }
public string sn { set; get; }
//overriding Equals method
public override bool Equals(object obj)
{
if (!(obj is FullName))
return false;
if (obj == null)
return false;
return this.fn == ((FullName)obj).fn &&
this.sn == ((FullName)obj).sn;
}
//overriding GetHashCode
public override int GetHashCode()
{
return this.fn.GetHashCode() ^ this.sn.GetHashCode();
}
}
如果类中有一个方法使用同一个类的字段,则可以使用该方法
public class FullName
{
public string fn { set; get; }
public string sn { set; get; }
//overriding Equals method
public override bool Equals(object obj)
{
if (!(obj is FullName))
return false;
if (obj == null)
return false;
return this.fn == ((FullName)obj).fn &&
this.sn == ((FullName)obj).sn;
}
//overriding GetHashCode
public override int GetHashCode()
{
return this.fn.GetHashCode() ^ this.sn.GetHashCode();
}
}
关键字也用于扩展方法。@Jon,我对您对第二个示例的想法很感兴趣。就我个人而言,我只想为支持字段命名一些不同的名称,以避免冲突,并且不需要使用“this”关键字。通常类似于私人会员的“_name”fields@masfenix:谢谢,我会加上的@西蒙:不,我喜欢这个。我不喜欢前缀干扰我的阅读,如果我为一个概念选择了一个名字,那么它大概是我能想到的最好的。写这篇文章的痛苦。偶尔是相对较小的。因此,本质上,这是个人的事情,没有技术上的理由选择其中一个。谢谢。关键字也用于扩展方法。@Jon,我对你对第二个例子的想法很感兴趣。就我个人而言,我只想为支持字段命名一些不同的名称,以避免冲突,并且不需要使用“this”关键字。通常类似于私人会员的“_name”fields@masfenix:谢谢,我会加上的@西蒙:不,我喜欢这个。我不喜欢前缀干扰我的阅读,如果我为一个概念选择了一个名字,那么它大概是我能想到的最好的。写这篇文章的痛苦。偶尔是相对较小的。因此,本质上,这是个人的事情,没有技术上的理由选择其中一个。谢谢。我认为这是最愚蠢的StyleCop规则之一,仅次于在每个私有字段上发表评论。我认为这是最愚蠢的StyleCop规则之一,仅次于在每个私有字段上发表评论。可能的重复