带参数的静态构造函数

时间:2018-07-30 09:20:53

标签: c# constructor static

我已阅读此线程"When is a static constructor called in C#",包括Programming Guide

但是有什么方法可以使用带有参数的静态构造函数?

我看到了一个问题,即在创建第一个实例之前调用了静态构造函数。我搜索任何智能解决方案/解决方案。

这里有一个example

public class Bus
{
    protected static readonly DateTime globalStartTime;
    protected static readonly int FirstBusNumber;

    protected int RouteNumber { get; set; }

    static Bus(/*int firstBusNumber*/)//Error if uncomment: The static constructor must be parameterless
    {
        //FirstBusNumer = firstBusNumber;
        globalStartTime = DateTime.Now;
        Console.WriteLine($"The First Bus #{FirstBusNumber} starts at global start time {globalStartTime.ToLongTimeString()}");
    }
    public Bus(int routeNum) 
    {
        RouteNumber = routeNum;
        Console.WriteLine($"Bus #{RouteNumber} is created.");
    }
    public void Drive()
    {
        var elapsedTime = DateTime.Now - globalStartTime;
        Console.WriteLine("{0} is starting its route {1:N2} minutes after the first Bus #{2}.",
           RouteNumber,
           elapsedTime.TotalMilliseconds,
           FirstBusNumber
        );
    }
}

...

var bus1 = new Bus(71);
var bus2 = new Bus(72);

bus1.Drive();
System.Threading.Thread.Sleep(25);
bus2.Drive();

System.Console.WriteLine("Press any key to exit.");
System.Console.ReadKey();

注意: 以下代码不是可接受的解决方案。

public Bus(int routeNum)
{
    if (FirstBusNumber < 1)
       FirstBusNumber = routeNum;
    // ... 
}

2 个答案:

答案 0 :(得分:1)

根据MSDN

  

将自动调用静态构造函数以初始化类   在创建第一个实例之前。因此,您无法向其发送任何参数。

但是您可以创建方法static来初始化您的静态值。

检查小提琴https://dotnetfiddle.net/4fnahi

public class Program
{
    public static void Main()
    {
        Bus.Init(0);
        Bus bus1 = new Bus(71);
        Console.WriteLine(Bus.FirstBusNumber); // it prints 71 as your expected
    }
}

public class Bus
{
    public static int FirstBusNumber;

    public static void Init(int firstBusNumber) => FirstBusNumber = firstBusNumber;

    public Bus(int routeNum)
    {
        if (FirstBusNumber < 1)
           FirstBusNumber = routeNum;
    }
}

答案 1 :(得分:0)

首先,您的示例来自Microsoft文档,您可以阅读更多[here]

您不能在c#中创建静态构造函数。如果您想要特定的类型行为,则可以选择实例类。有一种解决方法,您可以创建一个设置静态成员的静态方法,但是您需要记住明确使用它。 静态与类型本身有关。确保您的静态构造函数为此类型设置一次static globalStartTime,并在创建第一个实例之前初始化该类。 如果需要带参数的静态构造,则应该重新考虑。