【问题标题】:C# consoleApp Cannot call static method in separate classC# consoleApp 不能在单独的类中调用静态方法
【发布时间】:2017-11-27 12:16:10
【问题描述】:

在过去的几个小时里,我一直在尝试制作这个功能,希望能掌握类的使用。我一直在努力寻找答案,但其中大多数似乎对我的情况不起作用。

我创建了一个类 public class Car 以及一个构造函数和方法 static void ReadData()

现在我的目标是引入Car 的新实例并调用它,以便控制台读出它。主要问题是在public void main 下它拒绝识别我的ReadData() 方法。

这是我的代码:

namespace ConsoleApp13
{
class Program
{

    public void Main(string[] args)
    {

        Car crossOver = new Car("BMW", "X4", 2015, "6/23/17");

        ReadData(crossOver);  // debugger says that ReadData does not exist 
       {
       Console.ReadLine();
       }
    }

}

public class Car
{
    private string make;
    private string model;
    private int year;
    private string whenSold;

    public Car(string mk, string mdl, int yr, string sld)
    {
        make = mk;
        model = mdl;
        year = yr;
        whenSold = sld;
    }
    static void ReadData(Car Car)
    {
        Console.WriteLine("Make: " + Car.make);
        Console.WriteLine("Model: " + Car.model);
        Console.WriteLine("Year: " + Car.year);
        Console.WriteLine("Sold at: " + Car.whenSold);
    }
   }
  }

我尝试了几种不同的方法将静态放在作用域之前,但它总是以一些错误结束,或者控制台应用程序立即退出而不读取字符串

【问题讨论】:

  • 不要缩写您的参数名称。 mk, mdl, yr, sld 不清楚。遵循正常的 C# 约定,使用 make, model, year, whenSold。如果whenSold 代表一个日期,不要把它写成一个字符串!

标签: c# .net class methods constructor


【解决方案1】:
static void ReadData(Car Car)

您没有添加access modifier。默认为private。这意味着您无法在课堂之外访问它。你必须告诉编译器其他代码可以调用这个方法。

public static void ReadData(Car Car)

此外,要调用在类型上定义的静态方法,您必须使用类型的名称来调用它。

Car.ReadData(someCar);

当您掌握了这一点后,您实际上可以通过使用 C# 6 的一个新功能 static usings 而无需执行此操作

using static Car; // imports all static methods into the current context
{
    public void Main()
    {
        ReadData(new Car("lol"));
    }
}

【讨论】:

  • 这还不够。 ReadData 在 Car 类中而不是在 Program 类中。它需要 Car.ReadData。
  • @Steve 啊,是的。谢谢。
  • 嗨。我刚试过这个,没有任何改变。公共 void main 仍然无法识别 ReadData。
  • @JesperNiedermann 呐,那是上课用的。对于方法,那是private。对于给定的上下文,它始终是最受限制的。所以,我想我是在称自己为骗子——没有访问修饰符的嵌套类是私有的……但是在没有访问修饰符的命名空间中定义的类肯定是​​内部的。
  • 哇。你说的对。多年来,我一直对访问修改器很明确,以至于我忘记了在这种情况下方法是不一样的。谢谢你的澄清。
【解决方案2】:

您的代码中缺少 Car 以及上面@Will 指出的访问修饰符。应该是

Car.ReadData(crossOver);

或进行更多更改,您可以做的只是 将其公开而不是静态,删除 Car 参数然后使用 this. 而不是引用 @987654323 @参数,然后像这样调用代码

Car crossOver = new Car("BMW", "X4", 2015, "6/23/17");
crossOver.ReadData();

【讨论】:

  • +1,这是迄今为止最好的答案,因为它教会了 OOP 的正确使用——任何时候你在一个接受相同类型参数的类型中定义一个静态方法时,你应该只是改为使其成为实例方法。我什至建议从ReadData 更改名称,因为这与方法的行为无关——它实际上是在打印数据。如果ReadData 是一个静态工厂方法,它返回一个新的Car,而该方法已经基于字节流或其他机制构建,那么ReadData 会更有意义。
【解决方案3】:

由于 ReadData 静态函数是 Car 类的一部分,因此您必须将函数调用为:

Car.ReadData(crossover);

Main 无法识别 ReadData 的原因是它正在 Program 类中查找其定义。

你的整个代码:

namespace ConsoleApp13
{
    class Program
    {
        static void Main(string[] args)
        {

            Car crossOver = new Car("BMW", "X4", 2015, "6/23/17");
            Car.ReadData(crossOver);
            Console.ReadLine();
        }
    }

    public class Car
    {
        private string make;
        private string model;
        private int year;
        private string whenSold;

        public Car(string mk, string mdl, int yr, string sld)
        {
            make = mk;
            model = mdl;
            year = yr;
            whenSold = sld;
        }
        public static void ReadData(Car Car)
        {
            Console.WriteLine("Make: " + Car.make);
            Console.WriteLine("Model: " + Car.model);
            Console.WriteLine("Year: " + Car.year);
            Console.WriteLine("Sold at: " + Car.whenSold);
        }
    }
}

【讨论】:

    猜你喜欢
    • 2023-04-11
    • 2013-06-09
    • 2023-02-22
    • 1970-01-01
    • 2014-04-15
    • 1970-01-01
    • 2011-12-09
    • 2011-08-30
    相关资源
    最近更新 更多