C# 类型混淆:类型是类、变量和对象?
我目前正在学习Pluralsight C#5.0课程,而且我对编程比较陌生 我以前认为我基本上理解了数据类型的概念,Int/Array/Strings等等。 在本课程中,我们将开始介绍C#对类型的巨大重视,并创建您自己的自定义类型 我在下面包含的一个课程代码片段是拒绝接受,我希望如此 有人可以提供一些清晰或不同的思考方式 Program.cs:C# 类型混淆:类型是类、变量和对象?,c#,C#,我目前正在学习Pluralsight C#5.0课程,而且我对编程比较陌生 我以前认为我基本上理解了数据类型的概念,Int/Array/Strings等等。 在本课程中,我们将开始介绍C#对类型的巨大重视,并创建您自己的自定义类型 我在下面包含的一个课程代码片段是拒绝接受,我希望如此 有人可以提供一些清晰或不同的思考方式 Program.cs: GradeStatistics stats = book.ComputeStatistics(); GradeStatistics.cs: names
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
作为好的类设计的范例,因为它非常糟糕。如果你在理解变量方面有困难,那就更容易了。变量是包含值的可变存储位置。每个变量都与一个类型相关联,该类型限制变量中可以存储的值。(在大多数情况下,编译器已知的变量类型和运行时的变量类型是相同的,但在某些罕见的情况下,它们可能不同;现在不必担心这个细节。)我理解变量,但我发现很难掌握类型。作为一个初学者,感觉他们可以成为一切,这有点让人不知所措。感谢你的博客文章链接,他们看起来正是我想要的!