静态构造函数的理解
前两天看到一道题~~
class Program
{
static void Main(string[] args)
{
Caculator ca = new Caculator();
Caculator ca1 = new Caculator();
Console.WriteLine("Current object count is : " + Caculator.InstanceCount.ToString());
Console.ReadLine();
}
}
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
public class Caculator
{
public static int InstanceCount;
static Caculator()
{
InstanceCount++;
}
public Caculator()
{
InstanceCount++;
}
}
这个的输出结果是多少呢~~~
应该是3,Why~~~? 要理解这个问题首先要知道静态函数何时被调用~~, 在.Net中这个函数是第一次调用静态成员,执行实例化时发生. 而这个static的构造方法是不能被直接调用的, 因此在执行实例化操作时调用的还是这个public 的构造方法. 这个题稍微改一下就又不一样了`~
比如在 static Caculator() 方法前加一个public, 刚才讲过了,这个static的构造方法不能被直接调用, 因此加上这个public的修饰符是非法的,编译不能通过. 同时,这个方法也不能含有参数(还是因为不能手动调用), 否则也是非法的.
那么这个静态构造函数有什么用处呢~~ 比如可以用它来做日志类的初始化器~~应用程序可以利用它写入日志.
也可以用作非托管资源的包装类, 在这里可以调用LoadLibrary方法以选择需要加载的版本.
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockEnd.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockEnd.gif)
应该是3,Why~~~? 要理解这个问题首先要知道静态函数何时被调用~~, 在.Net中这个函数是第一次调用静态成员,执行实例化时发生. 而这个static的构造方法是不能被直接调用的, 因此在执行实例化操作时调用的还是这个public 的构造方法. 这个题稍微改一下就又不一样了`~
比如在 static Caculator() 方法前加一个public, 刚才讲过了,这个static的构造方法不能被直接调用, 因此加上这个public的修饰符是非法的,编译不能通过. 同时,这个方法也不能含有参数(还是因为不能手动调用), 否则也是非法的.
那么这个静态构造函数有什么用处呢~~ 比如可以用它来做日志类的初始化器~~应用程序可以利用它写入日志.
也可以用作非托管资源的包装类, 在这里可以调用LoadLibrary方法以选择需要加载的版本.