众所周知,c#中控制台应用程序中Main函数为静态函数,那为什么不能是非静态函数呢?
分析如下:
C#控制台中,如果Main是非静态函数,那么在调用的时候就需要进行实例化才能被调用,而系统在调用的时候是直接调用的Main函数,所以要声明成静态函数。
那可不可以通过重载Main函数,在静态Main函数中调用非静态的Main函数?
实验如下:
首先想到怎么重载,首先把Main的形参去掉
static void Main()
编译通过
如果直接把形参改掉
static void Main(int[] args)
编译失败,没有找到签名,也就是说编译器找不到特定的Main函数声明,失败。
仔细想了想,以下代码编译通过,重载Main函数,但是入口Main函数还是静态的
namespace ConsoleApplication1
{
class Program3
{
static int Main()
{
Program3 mya=new Program3();
mya.Main(1);
return 0;
}
int Main(int jjj)
{
Decimal[] myarr = new Decimal[40];
for (int i = 0; i < 40; i++)
{
try
{
Console.Write("请输入学号为[{0}]学生的成绩:",i+1);
Decimal temp = Convert.ToDecimal(Console.ReadLine());
if (temp <= 100 && temp >= 0)
{
myarr[i] = temp;
}
else if (temp==-1)
{
return 0;
}
else
{
Console.WriteLine("==========\n输入错误,请重新输入![输入\"-1\"退出]\n");
i = i - 1;
}
}
catch (Exception ex)
{
Console.WriteLine("==========\n输入错误,请重新输入![输入\"-1\"退出]\n");
i = i - 1;
}
}
return 0;
}
}
}
通过此代码所想到的一个问题:是否浪费内存?
分析如下:
系统再调用控制台应用程序的时候已经实例化了,但是在代码里又实例化了他本身,就是说他本身又实例化了一个自己,造成了内存的浪费。
想解决的问题:怎么能够完全摆脱控制台静态Main函数。(PS:估计要自己编译器才能实现吧。。。)
PS2:刚刚那个想起来先记上,老师推荐了本书,叫自己动手写编译器,里边全是关于正则表达式的,有空研究研究。
PS3:听说.NET是做delphi的人做的,而且听说好多语言都是他写的,崇拜ing~~有实力了自己写一个~~
本文探讨了C#中控制台程序的Main函数必须为静态的原因,分析了试图通过重载Main函数调用非静态Main的尝试及其编译结果。内容指出,非静态Main需要实例化,而系统直接调用静态方法,故需保持静态。同时,文中提到了可能的内存浪费问题,并讨论了如何彻底摆脱静态Main的限制。最后,作者分享了对编译器和正则表达式学习的兴趣,以及对.NET和Delphi背后开发者的好奇与敬佩。
370

被折叠的 条评论
为什么被折叠?



