Constructor C中“this.”关键字的正确用法?

Constructor C中“this.”关键字的正确用法?,constructor,parameters,field,this,keyword,Constructor,Parameters,Field,This,Keyword,我正在阅读Head First C这本书,到目前为止进展顺利,但我在理解使用this所涉及的语法时遇到了很多困难。关键词 从概念上讲,我知道我应该使用它来避免参数屏蔽同名字段,但是我在通过示例跟踪它时遇到了困难,他们似乎没有专门针对特定关键字的部分,他们只是解释它并开始在示例中使用它 有没有人在应用这一点时有什么好的经验法则。?或者任何在线教程,以不同的方式解释它,头一个C 谢谢 这是我写的。当且仅当它增强可读性时,例如,在实现可比较的Java接口时,但其思想是相同的: public void

我正在阅读Head First C这本书,到目前为止进展顺利,但我在理解使用this所涉及的语法时遇到了很多困难。关键词

从概念上讲,我知道我应该使用它来避免参数屏蔽同名字段,但是我在通过示例跟踪它时遇到了困难,他们似乎没有专门针对特定关键字的部分,他们只是解释它并开始在示例中使用它

有没有人在应用这一点时有什么好的经验法则。?或者任何在线教程,以不同的方式解释它,头一个C

谢谢

这是我写的。当且仅当它增强可读性时,例如,在实现可比较的Java接口时,但其思想是相同的:

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规则之一,仅次于在每个私有字段上发表评论。可能的重复