C#在这种情况下使用“this”关键字?

时间:2009-12-04 08:15:31

标签: c# oop this

我已经完成了OOP课程作业,我设计并编写了一个复杂数字类。为了额外的功劳,我可以做以下事情:

  1. 添加两个复数。该函数将一个复数对象作为参数并返回一个复数对象。当添加两个复数时,调用对象的实部被添加到作为参数传递的复数对象的实部中,并且调用对象的虚部被添加到作为传递的复数对象的虚部中。参数。

  2. 减去两个复数。该 功能将需要一个复杂的 number对象作为参数和 返回一个复数对象。什么时候 减去两个复数, 真实部分的复数 作为参数传递的对象是 从实际部分中减去 调用对象和虚构 复数对象的一部分 传递作为参数被减去 来自虚构的部分 调用对象。

  3. 我编写了这个,我用this关键字表示类的当前实例,我的add方法的代码如下,我的减法方法看起来很相似:

     public ComplexNumber Add(ComplexNumber c)
    {
        double realPartAdder = c.GetRealPart();
        double complexPartAdder = c.GetComplexPart();
    
        double realPartCaller = this.GetRealPart();
        double complexPartCaller = this.GetComplexPart();
    
        double finalRealPart = realPartCaller + realPartAdder;
        double finalComplexPart = complexPartCaller + complexPartAdder;
    
        ComplexNumber summedComplex = new ComplexNumber(finalRealPart, finalComplexPart);
    
        return summedComplex;
    }
    

    我的问题是: 我是否正确地做了这个并且风格很好? (使用this关键字)?

11 个答案:

答案 0 :(得分:18)

可以讨论this关键字的使用,但通常可以归结为个人品味。在这种情况下,虽然从技术角度来说是多余的,但我个人认为它增加了清晰度,所以我也会使用它。

答案 1 :(得分:6)

StyleCop工具中体现的Microsoft编码标准鼓励使用冗余this.

答案 2 :(得分:6)

您还可以重载数学运算符just like

public static ComplexNumber operator +(ComplexNumber c1, ComplexNumber c2)

答案 3 :(得分:3)

由于您现在正在学习C#并询问样式,因此我将向您展示您发布的代码以及原因的错误。

编辑:我只回应了这个,因为看起来你实际上正在努力解决这个问题。由于这是我喜欢与之合作的人,所以我更关键,因为我希望它可以帮助你更好地到达某个地方。 :)

结构名称

  1. ComplexNumber不必要地长。请注意,SingleDoubleInt32Int64等都不会在名称中包含Number。这表明Complex是一个更合适的名称。
  2. Complex与已在.NET Framework中建立的命名相匹配。
  3. 实部和虚部

    1. GetRealPart()GetComplexPart()应该是get-only属性而不是方法。
    2. GetComplexPart()被错误命名,因为它实际上正在返回虚构部分。
    3. 由于.NET框架已经具有Complex结构,因此您不应重新发明命名。因此,除非您能够重新定义框架约定,否则属性必须命名为RealImaginary
    4. 操作

      如果查看System.Windows.Vector等现有示例,您会看到通过提供静态方法和运算符来实现数学运算:

      public static Point Add(Vector vector, Point point);
      public static Point operator+(Vector vector, Point point);
      

      毫不奇怪,这个惯例延续到System.Numerics.Complex结构:

      public static Complex Add(Complex left, Complex right);
      public static Complex operator +(Complex left, Complex right);
      

      摘要

      结果干净,易于验证,并且表现得像每个人所期望的那样。 {/ 1}}关键字不会/不能出现,因为这些方法是静态的。

      this

答案 4 :(得分:1)

我只将此关键字用于变量,并且当有一个与私有变量同名的参数时。即。

private String firstname;
public SetName(String firstname)
{
    this.firstname = firstname;
}

答案 5 :(得分:0)

我会说是的,它看起来正确且易于阅读。但这不是你的技术援助应该回答的问题吗?

答案 6 :(得分:0)

此关键字的使用似乎很好。

虽然我相信像Complex这样的类,你应该把真实和复杂的部分存储为int属性并在方法中使用它们,而不是使用方法GetRealPart()和GetComplexPart()

我会这样做:

    class ComplexNumber
    {
        public int RealPart { get; set; }
        public int ComplexPart { get; set; }

        public ComplexNumber(int real, int complex)
        {
            this.RealPart = real;
            this.ComplexPart = complex;
        }

        public ComplexNumber Add(ComplexNumber c)
        {
            return new ComplexNumber(this.RealPart + c.RealPart, this.ComplexPart + c.ComplexPart);
        }
    }

以下是必须使用的场景,否则,对于LHS和RHS的分配,不考虑参数而不考虑类成员。

public ComplexNumber(int RealPart, int ComplexPart)
        {
            RealPart = RealPart; // class member will not be assigned value of RealPart
            ComplexPart = ComplexPart;
        }

答案 7 :(得分:0)

double realPartCaller = this.GetRealPart();

即使您从this中省略GetRealPart(),它仍应该没问题。但是this的使用使维护人员在阅读和理解时非常容易。

double realPartCaller = this.GetRealPart(); ==> bit more readable IMHO
double realPartCaller = GetRealPart();

答案 8 :(得分:0)

我发现自己越来越多地使用this关键字对当前实例的方法和属性,因为我觉得它增加了可读性和可维护性。如果您的类还具有静态方法和/或属性,当然您不能使用this关键字,因为这些与当前实例无关,这尤其有用。通过使用this,您可以清楚地看到差异。

为了更进一步,你应该考虑使用类名作为静态方法和属性的限定符,即使在类本身内也是如此。

答案 9 :(得分:0)

只是为了增加答案的完整性 - 有一种情况是this关键字是强制性的。当你有一个与类成员同名的局部变量(或方法参数)时。在这种情况下,不使用this编写它将访问局部变量,而使用this将设置类成员。举例说明:

class MyClass
{
    public int SomeVariable;

    public void SomeMethod()
    {
        int SomeVariable;

        SomeVariable = 4; // This assigns the local variable.
        this.SomeVariable = 6; // This assigns the class member.
    }
}

由此产生的一些事情:

  • 始终避免让局部变量与班级成员同名(我承认,我自己并不总是这样做);
  • 在所有成员访问之前编写this就像一个安全措施。如果你在没有它的情况下编写一段代码,然后引入一个与类成员具有相同名称和类型的局部变量,你的代码仍然可以编译得很好,但是会做一些完全不同的(也可能是错误的)。

虽然我在方法参数中使用与类成员相同名称的一个实例是在构造函数中。我经常这样写:

class MyClass
{
    public int VariableA;
    public string VariableB;

    public MyClass(int VariableA, string VariableB)
    {
        this.VariableA = VariableA;
        this.VariableB = VariableB;
    }
}

在我看来,这使得构造函数更清晰,因为你可以立即了解哪个参数设置了哪个类成员。

答案 10 :(得分:0)

如果您遵循命名约定,则使用此命名为

class MyClass 
{ 
    public int _variableA; 
    public string _variableB; 

    public MyClass(int variableA, string variableB) 
    { 
        _variableA = variableA; 
        _variableB = variableB; 
    } 
}