[C#] 了解过入口函数 Main() 吗?带你用批处理玩转 Main 函数
了解过入口函数 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 函数的更多相关文章
- 【Go入门教程3】流程(if、goto、for、switch)和函数(多个返回值、变参、传值与传指针、defer、函数作为值/类型、Panic和Recover、main函数和init函数、import)
这小节我们要介绍Go里面的流程控制以及函数操作. 流程控制 流程控制在编程语言中是最伟大的发明了,因为有了它,你可以通过很简单的流程描述来表达很复杂的逻辑.Go中流程控制分三大类:条件判断,循环控制和 ...
- 【Go入门教程5】流程(if、goto、for、switch)和函数(多个返回值、变参、传值与传指针、defer、函数作为值/类型、Panic和Recover、main函数和init函数、import)
这小节我们要介绍Go里面的流程控制以及函数操作. 流程控制 流程控制在编程语言中是最伟大的发明了,因为有了它,你可以通过很简单的流程描述来表达很复杂的逻辑.Go中流程控制分三大类:条件判断,循环控制和 ...
- thinkphp 的两种建构模式 第一种一个单入口里面定义两个模块,前台和后台,函数控制模块必须function.php前台加载前台模块的汉书配置文件,后台加载后台模块的汉书配置文件,公共文件共用。第二种架构模式两个单入口文件,分别生成两个应用定义define。。。函数可以定义配置文件。。。。
thinkphp 的两种建构模式 第一种一个单入口里面定义两个模块,前台和后台,函数控制模块必须function.php前台加载前台模块的汉书配置文件,后台加载后台模块的汉书配置文件,公共文件共用. ...
- 38 写一个函数,求一个字符串的长度,在main函数中输入字符串,并输出其长度。
题目:写一个函数,求一个字符串的长度,在main函数中输入字符串,并输出其长度. public class _038PrintLength { public static void main(Stri ...
- 写一个函数,求一个字符串的长度,在main函数中输入字符串,并输出其长度
import java.util.Scanner; /** * [程序38] * * 题目:写一个函数,求一个字符串的长度,在main函数中输入字符串,并输出其长度. * * @author Jame ...
- python中函数名后面带()和不带()的区别。
今天天气不冷,微热.9.18警钟长鸣,国人当自强不息. python中有时候会遇到一个函数名称后面没有带()被调用,这是为什么呢?看下面这个例子. def target(): #定义一个函数 prin ...
- oracle里面用sql做报表并带小计合计常用到的函数
1-- DECODE函数是Oracle PL/SQL是功能强大的函数之一,假设我们想给职员加工资,其标准是:工资在8000元以下的将加20%:工资在8000元以上的加15%,通常的做法是,先选出记录 ...
- C++学习45 流成员函数put输出单个字符 cin输入流详解 get()函数读入一个字符
在程序中一般用cout和插入运算符“<<”实现输出,cout流在内存中有相应的缓冲区.有时用户还有特殊的输出要求,例如只输出一个字符.ostream类除了提供上面介绍过的用于格式控制的成员 ...
- day16_函数作用域_匿名函数_函数式编程_map_reduce_filter_(部分)内置函数
20180729 补充部分代码 20180727 上传代码 #!/usr/bin/env python # -*- coding:utf-8 -*- # ***************** ...
随机推荐
- Sublime配置python开发环境
Package Control Package Control 是Sublime 里直接安装附加插件的包管理器.可以通过以下步骤手动安装: 1.点击Preferences > Browse Pa ...
- MongoDB系列(二):C#应用
前言 上一篇文章<MongoDB系列(一):简介及安装>已经介绍了MongoDB以及其在window环境下的安装,这篇文章主要讲讲如何用C#来与MongoDB进行通讯.再次强调一下,我使用 ...
- Java消息队列--JMS概述
1.什么是JMS JMS即Java消息服务(Java Message Service)应用程序接口,是一个Java平台中关于面向消息中间件(MOM)的API,用于在两个应用程序之间,或分布式系统中发送 ...
- 编写高质量代码:改善Java程序的151个建议(第8章:异常___建议114~117)
建议114:不要在构造函数中抛出异常 Java异常的机制有三种: Error类及其子类表示的是错误,它是不需要程序员处理也不能处理的异常,比如VirtualMachineError虚拟机错误,Thre ...
- 多线程 异步 beginInvoke EndInvoke 使用
有许多耗时操作时,还要响应用户操作.这时候就需要用其他线程或者异步来搞.本来是改造公司的日志组件.因为多上了个国外大区的业务到来本系统来.这个系统其他地方都好就是日志,动不动就要死给我们看.有时候寻找 ...
- centos 6 安装配置openvpn
下载地址:http://swupdate.openvpn.org/community/releases/http://www.oberhumer.com/opensource/lzo/download ...
- 如何在Open Live Writer(OLW)中使用precode代码高亮Syntax Highlighter
早先Microsotf的Windows Live Writer(WLW)现在已经开源了,并且更名为Open Live Writer,但是现在Windows Live Writer还是可以现在,Open ...
- ASP.NET Aries 4.0 开源发布:已完成基础功能优化重写
主要更新: 1:增加AR.Global.GetUser() 方法返回当前登陆者的用户信息. 2:重写AR.Combobox 支持下拉树. 3:调整及扩展Input下拉的配置参数. 4:优化及新增AR. ...
- MzBlog分析
早上衣明志 在QQ群里说他的博客开源了,地址在 https://github.com/qihangnet/MZBlog,基于NancyFX和MongoDB开发的.博客内容需要使用 MarkDown 进 ...
- SurfaceView 绘制分形图
之前一直做的是应用类,这次抽时间,参考网上资料实践了下SurfaceView.目标是在页面上画一个科赫曲线的分形图. 代码如下: package com.example.fredric.demo02; ...