了解过入口函数 Main() 吗?带你用批处理玩转 Main 函数

目录

  • 简介
  • 特点
  • 方法的参数
  • 方法的返回值
  • 与批处理交互的一个示例

简介

  我们知道,新建一个控制台应用程序的时候,IDE 会同时创建一个默认的类 Program.cs,该类会包含一个 Main 方法。我们在直接 F5 的时候就会立即执行里面的语句。但是,你自己有认真了解过它吗。

  Main 方法是 C# 控制台应用程序和 Windows 窗体应用程序的入口点(也称切入点)。应用程序启动时,Main 方法是第一个调用的方法。程序中只能,只允许有一个入口点,如果有许多类都包含 Main 方法,则必须使用 /main 编译器选项编译该程序,并选定用作入口点的 Main 方法。

  【备注】库和服务并不要求 Main 方法作为入口点。

  这也许是你刚入门 C# 的其中一个示例。

    class MyClass
{
static void Main(string[] args)
{
//输出命令行的参数长度
WriteLine(args.Length);
}
}

  【备注】这里没有指定访问修饰符,默认的访问级别为 private。

特点

  • 它是 .exe 程序的入口点(切入点),程序控制流在此处开始和结束。

  • 它在类或结构内声明。 它必须是静态的,且不应该 public。

  • 它的返回类型有两种:void 和 int

  • 它可以包含命令行实参的 string[] 形参,也可以没有形参。 使用 VS 创建 Windows 窗体应用程序时,你可以选择手动添加形参,当然,也可以选择使用 Environment 这样的类来读取 CMD 的实参。

  【备注】这里的它指 Main 方法。

方法的参数

  你可以通过这样的方式,将参数发送到 Main 方法。

   static void Main(string[] args)

   static int Main(string[] args)

  【备注】想在 Windows 窗体应用程序中的 Main 方法中启用 CMD 参数,你还得手动修改 Program.cs 类里面 Main 方法的签名。 因为,Windows 窗体设计器它自动生成的代码中,所包含的 Main 方法默认是不带参数的。 当然,你也可以用类似 Environment.GetCommandLineArgs 等方式从 CMD 或 Windows 应用程序中的任意位置访问 CMD 参数。

  

  参数 string[] args 是表示 CMD 参数的一个 String 数组。我们一般是通过判断 Length 属性来确定参数是否存在。请看:

         if (args.Length == )
{
WriteLine("Hello World.");
return ;
}

  也可以使用 Parse 方法将参数转换为数值类型。 请看:

             //结果是一样的
long num = Int64.Parse(args[]); long num = long.Parse(args[]); //Int64 的别名 long num = Convert.ToInt64(args[]); //Convert 类

方法的返回值

  它可以返回 void,也可以是 int。

     static void Main()
{
//...
} //返回类型:int
static int Main()
{
//...
return ;
}

  如果不希望 Main 的拥有返回值,你可以使用返回 void 简化代码。 但是,如果返回整数,则该程序可以与调用该 .exe 文件的其他程序或脚本进行信息交互。

与批处理交互的一个示例

  我打算使用一个批处理文件来执行程序,来测试 Main 函数的返回值。 在 Windows 中执行你的程序时,Main 函数会将返回的值存放到一个名字叫 ERRORLEVEL 的环境变量中。 通过 check 这个名字叫 ERRORLEVEL 的环境变量,批处理文件可以知道自己的执行结果。 通常,我们会以返回值为 0 来表示执行成功。

  下面是一个简单示例,从 Main 函数返回 0(0 表示程序运行成功)。 我将它命名为 MyMainTest.cs(修改了 Program.cs 的名字)。

     class MyMainTest
{
static int Main(string[] args)
{
//TODO: Other
return ;
}
}

  

  写好后定位到包含 MyMainTest.cs 的文件夹。

  我在里面新增了一个名为 yourTest.bat 的批处理文件。代码你可以直接粘贴:

rem yourTest.bat
@echo off
MyMainTest
@if "%ERRORLEVEL%" == "" goto ok :fail
echo Execution Failed
echo return value = %ERRORLEVEL%
goto end :ok
echo Execution succeeded
echo Return value = %ERRORLEVEL%
goto end :end

  注意,不要双击,因为是直接闪退看不到效果的。我们先打开 CMD,并定位到你的目录:

  接着,执行命令:csc MyMainTest.cs。这时,你就会看到自动帮你编译并生成了 MyMainTest 的可执行文件。

  最后,我们再次在命令行中执行 yourTest.bat,就可以看到结果了。

C# 基础回顾系列

  《C# 知识回顾 - 委托 delegate》、《C# 知识回顾 - 委托 delegate (续)

  《C# 知识回顾 - 事件入门》、《C# 知识回顾 - Event 事件

  《string 与 String,大 S 与小 S 之间没有什么不可言说的秘密

  《C# 知识回顾 - 你真的懂异常(Exception)吗?


【博主】反骨仔

【出处】http://www.cnblogs.com/liqingwen/p/6213624.html

【参考】微软官方文档  

[C#] 了解过入口函数 Main() 吗?带你用批处理玩转 Main 函数的更多相关文章

  1. 【Go入门教程3】流程(if、goto、for、switch)和函数(多个返回值、变参、传值与传指针、defer、函数作为值/类型、Panic和Recover、main函数和init函数、import)

    这小节我们要介绍Go里面的流程控制以及函数操作. 流程控制 流程控制在编程语言中是最伟大的发明了,因为有了它,你可以通过很简单的流程描述来表达很复杂的逻辑.Go中流程控制分三大类:条件判断,循环控制和 ...

  2. 【Go入门教程5】流程(if、goto、for、switch)和函数(多个返回值、变参、传值与传指针、defer、函数作为值/类型、Panic和Recover、main函数和init函数、import)

    这小节我们要介绍Go里面的流程控制以及函数操作. 流程控制 流程控制在编程语言中是最伟大的发明了,因为有了它,你可以通过很简单的流程描述来表达很复杂的逻辑.Go中流程控制分三大类:条件判断,循环控制和 ...

  3. thinkphp 的两种建构模式 第一种一个单入口里面定义两个模块,前台和后台,函数控制模块必须function.php前台加载前台模块的汉书配置文件,后台加载后台模块的汉书配置文件,公共文件共用。第二种架构模式两个单入口文件,分别生成两个应用定义define。。。函数可以定义配置文件。。。。

    thinkphp 的两种建构模式  第一种一个单入口里面定义两个模块,前台和后台,函数控制模块必须function.php前台加载前台模块的汉书配置文件,后台加载后台模块的汉书配置文件,公共文件共用. ...

  4. 38 写一个函数,求一个字符串的长度,在main函数中输入字符串,并输出其长度。

    题目:写一个函数,求一个字符串的长度,在main函数中输入字符串,并输出其长度. public class _038PrintLength { public static void main(Stri ...

  5. 写一个函数,求一个字符串的长度,在main函数中输入字符串,并输出其长度

    import java.util.Scanner; /** * [程序38] * * 题目:写一个函数,求一个字符串的长度,在main函数中输入字符串,并输出其长度. * * @author Jame ...

  6. python中函数名后面带()和不带()的区别。

    今天天气不冷,微热.9.18警钟长鸣,国人当自强不息. python中有时候会遇到一个函数名称后面没有带()被调用,这是为什么呢?看下面这个例子. def target(): #定义一个函数 prin ...

  7. oracle里面用sql做报表并带小计合计常用到的函数

    1-- DECODE函数是Oracle PL/SQL是功能强大的函数之一,假设我们想给职员加工资,其标准是:工资在8000元以下的将加20%:工资在8000元以上的加15%,通常的做法是,先选出记录 ...

  8. C++学习45 流成员函数put输出单个字符 cin输入流详解 get()函数读入一个字符

    在程序中一般用cout和插入运算符“<<”实现输出,cout流在内存中有相应的缓冲区.有时用户还有特殊的输出要求,例如只输出一个字符.ostream类除了提供上面介绍过的用于格式控制的成员 ...

  9. day16_函数作用域_匿名函数_函数式编程_map_reduce_filter_(部分)内置函数

    20180729    补充部分代码 20180727    上传代码 #!/usr/bin/env python # -*- coding:utf-8 -*- # ***************** ...

随机推荐

  1. TODO:Laravel 使用blade标签布局页面

    TODO:Laravel 使用blade标签布局页面 本文主要介绍Laravel的标签使用,统一布局页面.主要用到到标签有@yield,@ stack,@extends,@section,@stop, ...

  2. 记一个mvn奇怪错误: Archive for required library: 'D:/mvn/repos/junit/junit/3.8.1/junit-3.8.1.jar' in project 'xxx' cannot be read or is not a valid ZIP file

    我的maven 项目有一个红色感叹号, 而且Problems 存在 errors : Description Resource Path Location Type Archive for requi ...

  3. RxJS + Redux + React = Amazing!(译二)

    今天,我将Youtube上的<RxJS + Redux + React = Amazing!>的后半部分翻译(+机译)了下来,以供国内的同学学习,英文听力好的同学可以直接看原版视频: ht ...

  4. Objective-C中block的底层原理

    先出2个考题: 1. 上面打印的是几,captureNum2 出去作用域后是否被销毁?为什么? 同样类型的题目: 问:打印的数字为多少? 有人会回答:mutArray是captureObject方法的 ...

  5. Angular企业级开发(3)-Angular MVC实现

    1.MVC介绍 Model-View-Controller 在20世纪80年代为程序语言Smalltalk发明的一种软件架构.MVC模式的目的是实现一种动态的程序设计,使后续对程序的修改和扩展简化,并 ...

  6. 利用Node.js的Net模块实现一个命令行多人聊天室

    1.net模块基本API 要使用Node.js的net模块实现一个命令行聊天室,就必须先了解NET模块的API使用.NET模块API分为两大类:Server和Socket类.工厂方法. Server类 ...

  7. 在.NET Core之前,实现.Net跨平台之Mono+CentOS+Jexus初体验

    准备工作 本篇文章采用Mono+CentOS+Jexus的方式实现部署.Net的Web应用程序(实战,上线项目). 不懂Mono的请移步张善友大神的:国内 Mono 相关文章汇总 不懂Jexus为何物 ...

  8. 【Java每日一题】20170105

    20170104问题解析请点击今日问题下方的"[Java每日一题]20170105"查看(问题解析在公众号首发,公众号ID:weknow619) package Jan2017; ...

  9. 【从零开始学BPM,Day5】报表配置及自定义功能页面开发

    [课程主题] 主题:5天,一起从零开始学习BPM [课程形式] 1.为期5天的短任务学习 2.每天观看一个视频,视频学习时间自由安排. [第五天课程] 1.课程概要 Step 1 软件下载:H3 BP ...

  10. DevExpress - 使用 GaugeControl 标尺组件制作抽奖程序 附源码

    前不久,公司举办了15周年庆,其中添加了一个抽奖环节,要从在读学员中随机抽取幸运学员,当然,这个任务就分到了我这里. 最后的效果如下,启动有个欢迎页面,数据是来自Excel的,点击开始则上面的学号及姓 ...