C# 类型混淆:类型是类、变量和对象?

C# 类型混淆:类型是类、变量和对象?,c#,C#,我目前正在学习Pluralsight C#5.0课程,而且我对编程比较陌生 我以前认为我基本上理解了数据类型的概念,Int/Array/Strings等等。 在本课程中,我们将开始介绍C#对类型的巨大重视,并创建您自己的自定义类型 我在下面包含的一个课程代码片段是拒绝接受,我希望如此 有人可以提供一些清晰或不同的思考方式 Program.cs: GradeStatistics stats = book.ComputeStatistics(); GradeStatistics.cs: names

我目前正在学习Pluralsight C#5.0课程,而且我对编程比较陌生

我以前认为我基本上理解了数据类型的概念,Int/Array/Strings等等。 在本课程中,我们将开始介绍C#对类型的巨大重视,并创建您自己的自定义类型

我在下面包含的一个课程代码片段是拒绝接受,我希望如此 有人可以提供一些清晰或不同的思考方式

Program.cs:

GradeStatistics stats = book.ComputeStatistics();
GradeStatistics.cs:

namespace Grades
    {
        public class GradeStatistics
        {
            public GradeStatistics()
            {
                HighestGrade = 0;
                LowestGrade = float.MaxValue;
            }

            public float AverageGrade;
            public float HighestGrade;
            public float LowestGrade;
        }
    }
等级:

public GradeStatistics ComputeStatistics()
        {
            GradeStatistics stats = new GradeStatistics();

            float sum = 0f;
            foreach (float grade in grades)
            {
                stats.HighestGrade = Math.Max(grade, stats.HighestGrade);
                stats.LowestGrade = Math.Min(grade, stats.LowestGrade);
                sum += grade;
            }

            stats.AverageGrade = sum / grades.Count;
            return stats;
        }
我发现很难理解成绩统计到底是什么。 在本课程中,它不仅被称为一个类,而且被称为一个变量,而且还被称为 作为等级中的对象返回

任何清晰都是值得赞赏的,因为我发现所有这些都有点难以理解
上面的术语到处都是。

GradeStatistics
是一个类,来自此声明:

public class GradeStatistics
GradeStatistics stats = new GradeStatistics();
public GradeStatistics ComputeStatistics()
stats
是一个类型为
GradeStatistics
的变量,来自此声明:

public class GradeStatistics
GradeStatistics stats = new GradeStatistics();
public GradeStatistics ComputeStatistics()
ComputeTestistics
的返回类型为
GradeStatistics
,来自此声明:

public class GradeStatistics
GradeStatistics stats = new GradeStatistics();
public GradeStatistics ComputeStatistics()
所以,这是一门课。它用于声明具有特定类型的变量,并用于声明特定方法将返回的内容,即该类型的对象

如果有帮助的话,你可以把类型想象成蓝图。你可以有一个房子的蓝图。这会告诉你“如果你有房子”,这就是它的样子


当你构造一个类型的实例时,即建造房屋,你会得到一个实例。它有一个类型(它遵循蓝图),但它可能不同于其他实例,具有其他属性值(如所用油漆的颜色或门的样式)。

首先,GradeStatistics是一个

其次,它在任何地方都不是变量。但是在这一行中,stats实际上是一个类型为GradeStatistics的变量

GradeStatistics stats = new GradeStatistics();
第三,ComputeTestistics是一个返回成绩统计信息的函数


如果您读过OOP,您应该知道任何类类型的任何对象都可以作为函数返回值返回。

GradeStatics是一个定义为类的类。当您使用new关键字时,您正在创建该类(对象)的实例,您可以传递该实例或将其分配给变量


因此,在上面的代码片段中,GradeStatistics被定义为gradestatics.cs文件中的一个类。Grades.cs在ComputeTestics方法中创建该类的实例,并将其分配给在yhat方法中填充的stats变量,然后返回

GradeStatistics
是一个类。从这个片段:

    public class GradeStatistics
    {
        public GradeStatistics()
        {
            HighestGrade = 0;
            LowestGrade = float.MaxValue;
        }

        public float AverageGrade;
        public float HighestGrade;
        public float LowestGrade;
    }
但是,在方法
ComputeStatistics
中,返回类型是
GradeStatistics
,而不是您可能习惯的
void
。这意味着
ComputeTestistics
返回
GradeStatistics
。让我们看一个更简单的例子

假设我们有一个类
Foo
。其结构如下:

public class Foo
{
    public int a;
    public int b;

    public Foo()
    {
        a = 0;
        b = 0;
    }
}
现在我们可以创建
Foo
s并正常访问它们

Foo foo = new Foo();
foo.a = 4;
foo.b /= 2;
现在假设我们想这样做,除了很多次,所以我们创建了一个方法

public Foo IncrementFoo(int amount, int divideBy)
{
    Foo obj = new Foo();
    obj.a = amount;
    obj.b /= divideBy;
    return obj;
}
此方法创建类型为
Foo
的新对象,并返回它。然后,您可以使用以下代码:

Foo newFoo = IncrementFoo(4, 2);
//foo == newFoo
我建议你多读一些,特别是关于返回类型的


注意:在这种情况下,编写一个可能更好,特别是如果我们想修改
Foo
的单个实例,但我们不想深入讨论这个问题。另外,如果我们真的想创建一个像那样的
Foo
的新实例,最好使用构造函数。

感谢您的快速响应/花时间以清晰的方式解释它。非常感谢,谢谢!或者,相当重要的是,它的位置,因为它可能是道路上许多类似房屋中的一座,所有房屋都按照相同的蓝图建造,除了它们所在的位置,彼此之间无法区分。另一个奇妙的解释,谢谢:)。我也会仔细阅读你提供的链接。@orangey没问题!我认为msdn是一个很好的资源,特别是对于文档来说。对于我在变量引用方面的不清晰,我深表歉意。在课程幻灯片中,它只是作为类型等级统计的一个变量引用的,这让我有点不舒服。问题“类型到底是什么?”令人惊讶地难以回答,甚至专家程序员也不这么认为。关于我对类型不是什么的理解,请参见后面的“类型是什么”一文:我还注意到,您可能对这个特定的类有困难,因为它实际上不是一个设计非常好的类。不要使用
GradeStatistics
作为好的类设计的范例,因为它非常糟糕。如果你在理解变量方面有困难,那就更容易了。变量是包含值的可变存储位置。每个变量都与一个类型相关联,该类型限制变量中可以存储的值。(在大多数情况下,编译器已知的变量类型和运行时的变量类型是相同的,但在某些罕见的情况下,它们可能不同;现在不必担心这个细节。)我理解变量,但我发现很难掌握类型。作为一个初学者,感觉他们可以成为一切,这有点让人不知所措。感谢你的博客文章链接,他们看起来正是我想要的!