在函数调用中包含类名

时间:2015-01-20 17:48:00

标签: c#

我正在使用Microsoft Virtual Academy学习C#。这是我正在使用的代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Variables
{
    class Program
    {
        static void Main(string[] args)
        {
            Car myCar = new Car("BWM", "745li", "Blue", 2006);
            printVehicleDetails(myCar);
            Console.ReadLine();
        }
    }  

    abstract class Vehicle
    {
        public string Make { get; set; }
        public string Model { get; set; }
        public int Year { get; set; }
        public string Color { get; set; }

        public abstract string FormatMe();

        public static void printVehicleDetails(Vehicle vehicle)
        {
            Console.Writeline("Here are the vehicle's details: {0}", vehicle.FormatMe());
        }
    }

    class Car : Vehicle
    {
        public Car(string make, string model, string color, int year)
        {
            Make = make;
            Model = model
            Color = color;
            Year = year;
        }

        public override string FormatMe()
        {
            return string.Format("{0} - {1} - {2} - {3}",
                this.Make,
                this.Model,
                this.Color,
                this.year);
        }
    }

无论如何,我遇到的问题来自printVehicleDetails(myCar)行。当我尝试构建项目时,我收到错误“当前上下文中不存在名称'printVehicleDetails'。

我可以通过将行更改为Vehicle.printVechicleDetails(myCar)来修复错误。

有谁知道为什么我必须在该行中加入Vehicle

3 个答案:

答案 0 :(得分:5)

因为printVehicleDetailsVehicle类上的静态方法。当你调用静态方法时(在你所在的类之外的类上),你需要包含类名,以便编译器知道要绑定到哪个方法。

答案 1 :(得分:2)

printVehicleDetails是一种静态方法。要访问它,您必须告诉它该方法的位置,这就是将其更改为Vehicle.printVehicleDetails的原因。

或者,您可以从static的签名中删除printVehicleDetails,无需传递车辆参数,然后通过myCar.printVehicleDetails();进行调用。

public void printVehicleDetails()
{
    Console.Writeline("Here are the vehicle's details: {0}", this.FormatMe());
}

顺便说一句,printVehicleDetails并未向普遍接受的C# naming standards确认。它应该是PrintVehicleDetails()

答案 2 :(得分:1)

您有printVehicleDetails作为静态方法,这意味着它属于整个类而不属于实例,例如您的myCar变量。你的工作原理是什么,但它并不理想。在面向对象的世界中,我们希望有对象运行的方法,而不是全局方法(基本上是静态方法)。也就是说,我们不是采用一种带狗的方法让它吠叫,而是采用一种方法对狗进行调用,以便狗可以自行吠叫。

为了适应这种范式,我会完全摆脱printVehicleDetails并使用FormatMe。它会在Main方法中显示为:

Car myCar = new Car("BWM", "745li", "Blue", 2006);
Console.WriteLine("Here are the vehicle's details: " + myCar.FormatMe());
Console.ReadLine();