【问题标题】:Including the class name in function call [duplicate]在函数调用中包含类名[重复]
【发布时间】:2015-03-19 01:38:38
【问题描述】:

我只是在使用 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

【问题讨论】:

  • 因为它是 C# 标准所要求的?编译器怎么知道你指的是哪个方法?
  • 您在一个名为Program 的类中调用它,但该方法是Vehicle 类中的静态方法。您如何期望它知道在哪里可以找到该方法?真正的问题是,为什么要将它作为静态方法而不是实例方法?
  • @walther 我是 C# 和所有 OOP 的新手,我怎么知道这个?
  • @MattBurland 我正在关注 MVA 上的“绝对初学者的 C# 基础”。重新观看视频后,看起来 PrintVehicleDetails 应该是 Program 中的函数,而不是 Vehicle 中的函数。
  • @JPetersen:这样会更有意义。

标签: c#


【解决方案1】:

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

【讨论】:

  • 不是 100% 肯定,但我认为这应该会随着 c# 6.0 改变
  • @Franck:可以选择将静态方法(使用using 语句的变体)从类导入全局命名空间,但它不会自动发生。跨度>
【解决方案2】:

printVehicleDetails 是一个静态方法。要访问它,您必须告诉它方法在哪里,这就是为什么将其更改为 Vehicle.printVehicleDetails 有效。

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

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

顺便说一句,printVehicleDetails 不符合普遍接受的C# naming standards。应该是PrintVehicleDetails()

【讨论】:

    【解决方案3】:

    您将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();
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-09-11
      • 1970-01-01
      • 2016-07-17
      • 2016-03-29
      • 1970-01-01
      • 2014-02-23
      • 2013-04-10
      相关资源
      最近更新 更多