我的问题是,为什么Program
类被声明为static
?
正如你所注意到的,它不一定是。事实上,在我的 Visual Studio 版本(Visual Studio 2015 Enterprise Update 1)中,“控制台应用程序”的默认程序是
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ConsoleApplication
{
class Program
{
static void Main(string[] args)
{
}
}
}
但是等等,为什么又是Main
静态的呢?
这个答案很好地解释了为什么Main
必须是静态的。简而言之,答案Main
必须是静态的,因为替代方案是 CLR 必须调用构造函数Program
才能调用Program.Main
. 但是想一想,在入口点之前什么都没有发生,所以不能调用这样的构造函数!
问题的原因是,我认为Program
从实现处理的基类继承Application.ThreadException
而AppDomain.CurrentDomain.UnhandledException
不是为我的所有项目或多或少地实现它可能会很好。
这是一个非常好的主意;DRY是我最喜欢的编程原则之一。但是,要按照您的想法进行操作,Program
需要从类型的基础对象派生,例如,ProgramBase
并调用某种受保护的方法。大概是这样的?
internal class Program : ProgramBase
{
static void Main(string[] args)
{
// ERROR: "an object reference is required for the non-static
// field, method, or property ProgramBase.MainWrapper();"
MainWrapper();
}
protected override void DoMain()
{
// do something
}
}
internal abstract class ProgramBase
{
protected void MainWrapper()
{
try
{
// do some stuff
DoMain();
}
catch(...)
{
// handle some errors
}
}
protected abstract void DoMain();
}
问题出现了,要解决继承问题,Program.Main()
必须调用某种非静态方法。
好的,现在让我们以不同的方式解决问题。让我们为不同类型的应用程序创建一个ApplicationBase
抽象类来派生。
class Program
{
static void Main(string[] args)
{
var myApp = new MyApplication();
myApp.RunApp();
}
}
public class MyApplication : ApplicationBase
{
protected override void DoRunApp()
{
// do my stuff
}
}
public abstract class ApplicationBase
{
public void RunApp()
{
try
{
// create AppDomain, or some other construction stuff
// do some stuff
DoRunApp();
}
catch(...)
{
// handle some errors
}
catch(...)
{
// handle some other errors
}
}
protected abstract void DoRunApp();
}
现在我们正在取得进展。根据您在设置/创建阶段创建的内容,您的DoRunApp()
签名可能会发生变化,但这种模板应该可以完成您正在寻找的内容。
谢谢阅读。