C#对象和构造函数最佳实践

时间:2016-08-23 03:50:45

标签: c#

namespace Area
{
    public class Rectangle
    {
        private double length;
        private double width;

    public Rectangle() { }

    public Rectangle(double length, double width)
    {
        this.Length = length;
        this.Width = width;
    }

    public double Length
    {
        get
        {
            return length;
        }

        set
        {
            length = value;
        }
    }

    public double Width
    {
        get
        {
            return width;
        }

        set
        {
            width = value;
        }
    }

    public double getArea()
    {
        return width * length;
    }

    public double getPerimeter()
    {
        return 2 * width + 2 * length;
    }

    public double getDiagonal()
    {
        return Math.Sqrt(Math.Pow(width, 2) + Math.Pow(length, 2));
    }

我想确保我使用C#Objects的最佳做法。请使用上面的例子作为参考。

1。是否有必要键入第一个空的构造函数?在课堂上,教练总是对每个课程做过,但从未真正回答过为什么。

public Rectangle(){}

2。在我的自定义构造函数中,Visual Studio生成如下: this.Length =长度;

我知道“this”关键字不一定是键入的方式,但在课堂上教师有时会将其更改为小写,如下所示:

this.length = length;

但有时候他并没有改变它。哪种方式是最佳做法?

左边是实际属性吗?然后右边是场地?

所以它是,属性等于字段?

第3。最后,在这种情况下,我只能输入我的属性:

public string Length {get;组; }

而不是Visual Studio使用返回值生成的方式。

很抱歉这篇长篇文章,我厌倦了在学校得到不同的答案,并希望得到最终答案,谢谢。

3 个答案:

答案 0 :(得分:2)

我建议您的课程如下:

public class Rectangle
{
    public Rectangle(double length, double width)
    {
        this.Length = length;
        this.Width = width;
    }

    public double Length { get; set; }
    public double Width { get; set; }
    public double Area { get { return this.Width * this.Length; } }
    public double Perimeter { get { return 2.0 * (this.Width + this.Length); } }
    public double Diagonal { get { return Math.Sqrt(Math.Pow(this.Width, 2.0) + Math.Pow(this.Length, 2.0)); } }
}

答案 1 :(得分:0)

  1. 请参阅here了解您可能需要空白构造函数的原因。总而言之,添加一个非空的构造函数将阻止编译器为您生成一个空白的构造函数(编译器假定如果您需要它,您将使用您编写的其他构造函数定义它)。如果没有空白构造函数,某些内容(如序列化)将无法运行,因此您可能需要添加一个。

  2. 在我的职业生涯中,我经常看到人们避免在构造函数中使用它。也许避免不是正确的词,但除非它不清楚,他们只是没有费心把它放在那里。这可能是一个太小的问题,失去任何睡眠。

  3. 根据您的一些评论进行更新

    写作时

    public Rectangle(double length, double width)
    {
        Length = length; //parameter length assigned to field length by virtue of property Length
    }
    

    您将参数长度分配给属性Length,它本身将传入的值分配给length private字段。由于C#区分大小写,因此在任何情况下都不会混淆长度和长度,并且您不需要指定this关键字。

    在一个名为length的参数的方法中,语言假定您在键入length时引用方法的参数。所以如果你尝试做这样的事情:

        public Rectangle(double length, double width)
        {
            length = length; //warning: Assignment made to same variable; did you mean to assign to something else
        }
    

    编译器不会尝试并假设您将属性分配给字段,这只是将length参数赋给自身。在这种情况下,您可以使用this关键字告诉编译器您要将参数长度分配给私有字段长度,如下所示:

        public Rectangle(double length, double width)
        {
            this.length = length; //no warning
        }
    

    END UPDATE

    1. 是的,您可以将该属性声明为Property {get; set;}。此功能仅来自C#3.0,称为自动实现的属性(请参阅此link)。在此之前,您必须自己提供实施。

答案 2 :(得分:0)

我把课程改为:

public class Rectangle
    {
        public Rectangle(double length, double width)
        {
            Length = length;
            Width = width;
        }

        public double Length { get; set; }

        public double Width { get; set; }

        public double getArea()
        {
            return Width * Length;
        }

        public double getPerimeter()
        {
            return 2 * Width + 2 * Length;
        }

        public double getDiagonal()
        {
            return Math.Sqrt(Math.Pow(Width, 2) + Math.Pow(Length, 2));
        }
    }

如果有人对上述任何事情有任何其他反馈,请建议您更改,我会非常快速地抓住并希望了解正确的方法。