第一篇之由Main函数联想开来
开篇
本系列是个人的一个学习C#的学习笔记,适合对象为:至少学习过C语言的,最好学习过C++和JAVA的,因为本事我也是搞C++,大学学的是JAVA,公司要用C#,所以会联系C/C++,JAVA的异同的来比较着学习,对于基本的C语法,如for循环了,switch判断了,等等,这些基本的语法就不一一概述了,单独会详细介绍一些与其他三种语言的异同来学习。
C#(读sharp),c++++的缩写,可以认为是c系列的升级版本,当然不完全是,下面的学习过程中会步步深入了解那些不一样的地方。
C#是基于.net平台的,.net平台是什么?度娘吧,不是一句两句的问题,可以粗浅认识为.net相当于一个操作系统,c#是这个操作系统上面的一个应用程序,这个操作系统上面还有其他的应用程序如VB等,也可先简单的认为是JAVA的虚拟机。
第一个C#程序HelloWorld
using System;
namespace FirstTest
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine("HelloWorld!");
Console.ReadLine();
}
}
}
执行结果:
解释:
1.C#默认的访问权限是private类型,所以这个Main函数式private的,java中mian(m小写)函数是public的。
2.Main函数为什么是static的?
首先要知道,static函数是属于类的,不能通过类的实例化(程序员手工new一个对象),来调用,只能通过className.methodName()形式来调用。Main函数是操作系统运行这个程序的入口,操作系统要进入这个函数,通常应该是new一个对象,然后,通过对象来调用该函数,但是这个类(包含main方法的类)只是为了提供给操作系统来调用的接口用的。
接着要明白static方法与非static方法的区别:
static方法:只加载内存一次,一直到程序结束都存在在程序中,没有放在堆栈区,而是放在静态公共存储区域,它只属于类,而不属于对象。
非static方法:需要多次加载到内存中,当调用的时候就将函数指针保存到运行堆栈中,函数结束或者垃圾回收的时候就会释放,需要多次加载,学过汇编的肯定知道我在说什么。
一般static方法用于使用频率高的场合,而非static方法用于使用频率不高的场合(需要多次加载到内存,比较耗费时间)(注意这里是一般,没有说完全,譬如本处的特例就是Main函数就是仅仅加载到内存中一次。)
一句话概括就是,完全可以不声明为static的,但是就要要求操作系统去创建一个无意义的对象,来调用这个Main函数,并且调用完就会释放掉。(我的理解,可能操作系统的进程可能需要这个函数指针来标示该程序,Main函数就相当于该程序的主进程,它必须是一直存在内存中,如果它就析构掉了,可能其他函数的基地址就不存在了,那么找不到程序中的其他可执行的地址)
3.参数string[] args的含义是?
这个参数是字符串数组,在Main函数中可以调用,所有关于数组的函数,来操作这个参数,这个参数值是来自于console的输入字符串,通常我们不需要从console传递参数,所以用的较少。
4.static在c/c++,java,c#的意义?
c语言中:
- 变量会被放在程序的全局存储区中,这样可以在下一次调用的时候还可以保持原来的赋值。这一点是它与堆栈变量和堆变量的区别。
- 变量用static告知编译器,自己仅仅在变量的作用范围内可见。这一点是它与全局变量的区别。
- Tips:
- A.若全局变量仅在单个C文件中访问,则可以将这个变量修改为静态全局变量,以降低模块间的耦合度;
- B.若全局变量仅由单个函数访问,则可以将这个变量改为该函数的静态局部变量,以降低模块间的耦合度;
- C.设计和使用访问动态全局变量、静态全局变量、静态局部变量的函数时,需要考虑重入问题;
- D.如果我们需要一个可重入的函数,那么,我们一定要避免函数中使用static变量(这样的函数被称为:带“内部存储器”功能的的函数)
- E.函数中必须要使用static变量情况:比如当某函数的返回值为指针类型时,则必须是static的局部变量的地址作为返回值,若为auto类型,则返回为错指针。
- 函数前加static使得函数成为静态函数。但此处“static”的含义不是指存储方式,而是指对函数的作用域仅局限于本文件(所以又称内部函数)。使用内部函数的好处是:不同的人编写不同的函数时,不用担心自己定义的函数,是否会与其它文件中的函数同名。
- 扩展分析:术语static有着不寻常的历史.起初,在C中引入关键字static是为了表示退出一个块后仍然存在的局部变量。随后,static
- 在C中有了第二种含义:用来表示不能被其它文件访问的全局变量和函数。为了避免引入新的关键字,所以仍使用static关键字来表示这第二种含义。最后,
- C++重用了这个关键字,并赋予它与前面不同的第三种含义:表示属于一个类而不是属于此类的任何特定对象的变量和函数(与Java中此关键字的含义相
- 同)。
1在函数体,一个被声明为静态的变量在这一函数被调用过程中维持其值不变。
2 在模块内(但在函数体外),一个被声明为静态的变量可以被模块内所用函数访问,但不能被模块外其它函数访问。它是一个本地的全局变量。
3在模块内,一个被声明为静态的函数只可被这一模块内的其它函数调用。那就是,这个函数被限制在声明它的模块的本地范围内使用。
大多数应试者能正确回答第一部分,一部分能正确回答第二部分,同是很少的人能懂得第三部分。这是一个应试者的严重的缺点,因为他显然不懂得本地化数据和代码范围的好处和重要性
静态的用 类名直接调用
非静态 实例化 以后才能调用
6,待解决问题,操作系统中管态到目态那个接口是怎么样的,这个能明白了,差不多就能从底层深入了解main函数的作用了?