C #, используя ключевое слово "this" в этой ситуации? - PullRequest
7 голосов
/ 04 декабря 2009

Я выполнил задание курса ООП, где я проектирую и кодирую класс комплексного числа. Для дополнительного кредита я могу сделать следующее:

  1. Добавьте два комплексных числа. Функция примет один объект комплексного числа в качестве параметра и вернет объект комплексного числа. При добавлении двух комплексных чисел действительная часть вызывающего объекта добавляется к действительной части объекта комплексного числа, переданного в качестве параметра, а мнимая часть вызывающего объекта добавляется к мнимой части объекта комплексного числа, переданного как параметр.

  2. Вычтите два комплексных числа. функция займет один комплекс номер объекта в качестве параметра и вернуть объект комплексного числа. когда вычитая два комплексных числа, действительная часть комплексного числа Объект передан в качестве параметра вычитается из реальной части вызывающий объект и воображаемый часть объекта комплексного числа передается как параметр вычитается от мнимой части вызывающий объект.

Я закодировал это и использовал ключевое слово 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;
}

Мой вопрос: Я сделал это правильно и с хорошим стилем? (используя это ключевое слово)?

Ответы [ 11 ]

18 голосов
/ 04 декабря 2009

Можно обсудить использование ключевого слова this, но обычно оно сводится к личному вкусу. В этом случае, хотя с технической точки зрения это избыточно, я лично считаю, что это добавляет ясности, поэтому я бы также использовал его.

6 голосов
/ 04 декабря 2009

Вы также можете перегрузить математические операторы, , как :

public static ComplexNumber operator +(ComplexNumber c1, ComplexNumber c2)
6 голосов
/ 04 декабря 2009

Использование избыточного this. поддерживается стандартами кодирования Microsoft, воплощенными в инструменте StyleCop .

3 голосов
/ 03 апреля 2010

Поскольку вы сейчас изучаете C # и спрашиваете о стиле, я собираюсь показать вам несколько вещей, которые не соответствуют коду, который вы опубликовали, а также причины.

Редактировать: Я только ответил на это, потому что похоже, что вы действительно работаете, чтобы выяснить это. Поскольку я предпочитаю работать именно с такими людьми, я более критичен просто потому, что надеюсь, что в результате это поможет вам добиться большего. :)

Название структуры

  1. ComplexNumber неоправданно долго. Обратите внимание, что ни один из Single, Double, Int32, Int64 и т. Д. Не имеет Number в имени. Это предлагает Complex как более подходящее имя.
  2. Complex соответствует имени, уже установленному в .NET Framework.

Реальные и мнимые компоненты

  1. GetRealPart() и GetComplexPart() должны быть свойствами только для получения, а не методами.
  2. GetComplexPart() назван неправильно, потому что он на самом деле возвращает воображаемую часть.
  3. Поскольку платформа .NET уже имеет структуру Complex, вам не следует заново изобретать наименование. Поэтому, если вы не можете переопределить рамочные соглашения, свойства должны иметь имена Real и Imaginary.

Операция

Если вы посмотрите на существующие примеры, такие как 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);

Резюме

Результат чистый, его легко проверить, и он ведет себя так, как все ожидают. Ключевое слово this не может / не может появиться, потому что методы являются статическими.

public static Complex Add(Complex left, Complex right)
{
    return new Complex(left.Real + right.Real, left.Imaginary + right.Imaginary);
}

public static Complex operator +(Complex left, Complex right)
{
    return new Complex(left.Real + right.Real, left.Imaginary + right.Imaginary);
}
1 голос
/ 04 декабря 2009

Я использую это ключевое слово только для переменных и когда есть аргумент, имя которого совпадает с именем закрытой переменной. т.е.

private String firstname;
public SetName(String firstname)
{
    this.firstname = firstname;
}
0 голосов
/ 03 апреля 2010

Если вы следуете соглашениям по присвоению имен, то для этого необходимо указать:

class MyClass 
{ 
    public int _variableA; 
    public string _variableB; 

    public MyClass(int variableA, string variableB) 
    { 
        _variableA = variableA; 
        _variableB = variableB; 
    } 
}
0 голосов
/ 04 декабря 2009

Просто для полноты ответов - есть один случай, когда ключевое слово 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;
    }
}

По моему мнению, это делает конструктор более понятным, потому что вы сразу понимаете, какой параметр устанавливает какой член класса.

0 голосов
/ 04 декабря 2009

Я все больше и больше использую ключевое слово this как для методов, так и для свойств в текущем экземпляре, так как считаю, что это повышает удобочитаемость и удобство обслуживания. это особенно полезно, если у вашего класса также есть статические методы и / или свойства, для которых вы, конечно, не можете использовать ключевое слово this, поскольку они не связаны с текущим экземпляром. Используя this, вы четко видите разницу.

Чтобы продвинуться еще дальше, вам следует рассмотреть возможность использования имени класса в качестве квалификатора для статических методов и свойств, даже внутри самого класса.

0 голосов
/ 04 декабря 2009
double realPartCaller = this.GetRealPart();

Даже если вы опустите this из GetRealPart(), все равно все будет в порядке. Но использование this делает его довольно простым для чтения и понимания, когда речь идет о сопровождающем.

double realPartCaller = this.GetRealPart(); ==> bit more readable IMHO
double realPartCaller = GetRealPart();
0 голосов
/ 04 декабря 2009

Использование этого ключевого слова в порядке.

Хотя я считаю, что для такого класса, как 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;
        }
...