c# - 带参数的静态构造函数
问题描述
我已经阅读了这个线程“When is a static constructor called in C#”,包括编程指南。
但是有什么方法可以使用带参数的静态构造函数吗?
我看到了问题,即在创建第一个实例之前调用了静态构造函数。我搜索任何智能解决方案/解决方法。
这里有一个例子:
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;
// ...
}
解决方案
根据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;
}
}
推荐阅读
- postgresql - 端口 5432 正在侦听,但仍处于关闭状态
- r - 如何在ggplot2中为我的直方图的每个条添加标签?
- airflow - 创建 Airflow 连接后如何测试它?
- spring - Hibernate Inheritance - 将关系设置为 null
- html - 单击Wordpress中的项目时如何重置导航栏
- c# - 如何将 2D Sprite 统一添加到材质中?
- python - 如何在 python 中使用 any 进行 n^2 搜索
- r - R:计算 log(exp(...)) 的最大浮点误差
- java - superTrend的Java实现
- php - 在 laravel 中更新具有两个不同数组的多个值