1. 方法的声明方法:
成员访问修饰符 返回值类型 函数名称(参数列表)
{
函数体内容
}
返回值类型:不可缺少,没有返回值用void。
下面,列举出一个简单的实例:
using System;
namespace CS
{
class A
{
public static void Main()
{
Console.WriteLine("Now time is:{0}",Write()); //对方法public static void Write()的调用。
}
public static DateTime Write()
{
return DateTime.Now;
}
}
}
2.共享变量(和C++中类的静态变量相近)
如果两个方法要共享一个变量,则要将此变量声明在类阶层。类级别的变量的声明周期是在此类加载到内存时就会自动分配内存空间,要等到次对象被CLR的垃圾回收GC时,才会释放掉所用的内存空间。
如:
Using System;
namespace CS
{
Class Method
{
public static int i = 0; //声明为共享变量
public void addi()
{
i++;
}
}
}
3.方法参数传递机制
a.值参数
方法名称(参数类型,参数名称...)
---在内存的堆栈中声明一个局部变量,把参数的值传到该局部变量,然后,就是对该局部变量进行操作。
b.引用参数
方法名称(ref 参数类型,参数名称...)
---声明一个参数的引用(实际上是通过指针实现的),对改引用变量的修改,会对原变量进行修改。
---传递的参数必须初始化
---调用时,函数必须带ref
c.输出参数
方法名称(out 参数类型,参数名称...)
---和引用参数的调用类似,传送的也是变量的地址。
---参数必须在方法体内初始化,因此,一般不在Main方法中初始化。
区别:如果方法参数标记为out,那么调用者不希望在调用方法前初始化对象,被调用方法不能读取对象的值,而且被调用方法必须在返回前对其进行初始化。如果方法标记为ref,那么调用者必须在调用方法之前对其进行初始化,被调用方法可以读取参数或者为参数赋值。
Using System;
namespace CS
{
Class Method
{
public void static ValueAddi(int i)
{
i++; //对i的修改,不会对传入参数进行修改
}
public void static ReferenceAddi(ref int i)
{
i++; //对传入参数进行修改,传入参数必须先赋值
}
public void static OutAddi(out int i)
{
int i = 0;
i++;//对传出参数,参数必须在函数外进行声明
}
public void Main()
{
int m = 0,n = 0,l;
ValueAddi(m); //m=0;
ReferenceAddi(n); //n=1
Out.Addi(l); //l=1
}
}
}
4.对可变参数个数,使用关键字params
namespace CS
{
Class Method
{
public static int Addi(params int[] values)
{
int sum = 0;
foreach(int i in values)
sum+=i;
return sum;
}
public void Main()
{
Addi(1,2,3); //返回6
Addi(1,2,3,4,5); //返回15
}
}
5.值类型VS引用类型
值类型 引用类型
变量存放 在堆栈中存真正的数据 在堆栈中存放指向数据的指针
内存空间分配 堆栈 托管堆
内存需求 较少 较大
效能 较快 较慢
内存释放 声命周期内保存 GC管理
是否null 不可以为null 可以为NULL
值类型在特定情况下要进行拆箱和装箱操作,使得效能变差。
在函数进行值类型的参数传递时,如果改类型为引用类型(如数组),对改变量的更改,将会对传入参数进行修改。
但是,对于某些特殊的引用类型,如string类型,则不会发生改变。因为,字符串在创建之后,就不能对其进行修改,而只是在堆中创建另外的一个字符串。