using System;
namespace MyProgram
{
class Point
{
public readonly int X;
public readonly int Y;
public Point (int x, int y)
{
X = x;
Y = y;
}
^这是父类
namespace MyProgram
{
class MapLocation : Point
{
public MapLocation(int x, int y, Map map) : base(x, y)
^这是子类
基本上,我的问题是:类之间的参数传递如何工作?什么是记住传递参数的规则的简单方法?而且,在它说public MapLocation(int x, int y, Map map) : base(x, y)
的地方,我不明白为什么它只是x,y而不是' int'? C#变得非常令人沮丧,我没有太多的乐趣:(帮助将不胜感激。
答案 0 :(得分:1)
它说公共MapLocation(int x,int y,Map map):base(x,y),我不明白为什么它只是x,y而不是'int'?。
想象一下你有这个:
public class ClassOne
{
public int MethodOne(int x, int y)
{
return x + y;
}
}
现在让我们来电话MethodOne
:
ClassOne one = new ClassOne();
int answer = one.MethodOne(2, 3); //<== see this, now read note below
int first = 2;
int second = 3;
int answer2 = one.MethodOne(first, second); //<== see this, now read note below
当您调用方法时,您将参数传递给它:不需要指定参数的类型,因为它们将从它们的类型推断出来。例如,在上面我们简单地传递2和3,因此编译器知道这些是int
常量。在第二个调用中,它们是first
和second
的类型,它们都是int
。
当您调用这样的基础构造函数时:base(x,y),它与您调用方法时的想法相同,如上所述。 x
和y
的类型来自:MapLocation(int x, int y, ...
。如果将其更改为MapLocation(string x, int y, ...
,则编译器会抱怨。 试一试,看看。
现在假设我们有一个类型不是该方法所期望的类型,如下所示:
long x = 1;
int y = 2;
现在x
的类型为long
但MethodOne
需要一个整数,因此我们需要将x
投射到int
(请注意,不是每个long
{1}}将适合int
,因此可能会失败)。以下是我们如何做到这一点:
one.MethodOne((int)x, y); //<== see the casting
答案 1 :(得分:0)
您正在定义MapLocation(int x,int y,Map map),因此您需要指明类型。你可以说它们是参数。 你正在调用base(x,y),所以x,y是参数。 参考: What's the difference between an argument and a parameter?
答案 2 :(得分:0)
代码行public MapLocation(int x, int y, Map map) : base(x, y)
意味着,在构造MapLocation
给定的整数x
,y
和Map map
时,请调用基类(Point
)的构造函数,其值为x
和y
。
您不是在类本身之间传递参数,而是更恰当地调用基类的构造函数。
答案 3 :(得分:0)
base(x, y)
没有说int x, int y
因为它不是方法/函数声明,base
正在调用传递x
和y
的基类构造函数这是提供给MapLocation
构造函数的参数。因此,正如您所期望的那样,在int
构造函数中声明参数MapLocation
。
你如何记住规则或传递你周围的参数。在没有伤害大脑的基本简单的东西之外,你没有。
如果您了解x
和y
是为MapLocation构造函数声明的int
类型的参数,并且您了解可以使用{{1在C#中调用基类构造函数}}。然后很容易记住传递给子类构造函数的任何内容都可以通过C#中的: base()
传递给父构造函数,因此在代码示例中base
: base(x, y)
只是在C#中调用父类构造函数的语法糖。 base
参数必须与构造函数中定义的父类参数匹配,因此在代码示例base
中,Point(int x, int y)
可以更快地说出base(x, y)
。
答案 4 :(得分:0)
记住传递参数规则的简单方法是什么 围绕?
C#是强类型语言,因此类型提供了如何将参数传递给其方法的规则
用于编写C#的所有现代IDE将为您提供有关应将哪些参数传递给方法的信息。所以,实际上在Visual Studio中,Intellisense会告诉你规则。 Using IntelliSense。
如果提供了错误类型的参数或缺少某些参数,编译器将无法编译代码。
而且,它说公共MapLocation(int x,int y,Map map): base(x,y),我不明白为什么它只是x,y而不是'int'?
: base(x, y)
只是方法调用,这就是为什么你不需要再次声明类型,它们已经在基类的构造函数中声明了。
答案 5 :(得分:0)
我不明白为什么它只是x,y而不是&#39; int&#39;?
因为您正在调用基础构造函数。不要将此视为子类定义的一部分......这是现在实现的一部分。当您说base(x,y)
时,您使用与调用任何其他函数相同的语法。