C#函数基础概念回顾
*函数的名称和参数列表共同定义了函数的签名
*从静态的角度讲,函数形式
static <returnType><functionName>(<paramType><paramName>,.....)
{
//.....
return <returnType>;
}
基本概念
1.参数数组
C#允许为函数指定一个且只能指定一个特定的参数,这个参数必须是函数定义中的最后一个参数,称为参数数组。参数数组可以使用个数不定的参数调用函数,可以使用params关键字定义它们。
例:
static int sumVals(params int[] vals)
{
int sum=0;
foreach(int val in vals)
{
sum+=val;
}
return sum;
}
2.引用参数
函数处理的变量与函数使用中的变量相同,而不仅仅是值相同。在函数中,对该变量的任何改变都会影响用作参数的变量值。关键字:ref在函数定义和函数调用中用作参数的修饰符。
注意 :(1)参数不能使常量 (2)变量使用前必须初始化
3.输出参数
关键字:out 使用前可以赋值也可以不赋值,如果使用已赋值的变量作为参数,则值可能在函数执行时消失。
例:
static int MaxVal(int [] array,out int maxIndex)
{
int maxVal=array[0];
maxVal=0;
for(int i=0;i<array.length;i++)
{
if(array[i]>maxVal)
{
maxVal=array[i];
maxIndex=i;
}
}
}
4.结构函数
结构可以包含函数和数据,定义在结构内的变量对结构是可见的,可以被看做全局变量。
5.函数重载
允许函数创建多个同名函数,这些函数可以使用不同的参数类型,并列出现在代码中,但是,函数的返回类型并不是函数签名的一部分
6.委托(delegate)
作用:可以把引用存储为函数的类型。委托的声明类似于函数,但是不带函数体,委托的声明指定一个返回类型和参数列表。
例如 : 定义:
delegate double ProcessDelegate(double param1,double param2);
satic double Multiply(double param1,double param2)
{
return param1*param2;
}
static double Add(double param1,double param2)
{
return param1+param2;
}
使用:
ProcessDelegate process;
process=new ProcessDelegate(Multiply);
具体可见博客: http://www.cnblogs.com/jimmyzhang/archive/2007/09/23/903360.html
附注:
关于C#变量作用域
区别于C语言,变量作用域不仅受函数体的限制而且还受循环体的限制。只声明一个变量并不影响其他变化,只有当变量被赋值时,才会占用一块内存空间,如果这种占据内存空间的行为在循环中发生,该值只是被定义为一个局部值,在循环外部会超出其定义域。如果变量在进入循环前被声明、赋值(即使是空),则经过循环后改变变量的值,在推出循环后仍然可以被访问。
关于C# 中static的几点思考
- static关键字的确是面向过程开发的时代就有的关键字,但是并不代表是面向对象开发中就应该尽量避免static关键字。
- 静态类跟非静态类效果肯定是不一样的,区别肯定是有的。
- 根据笔者的经验,static类一般用于与状态无关的类。那么,什么是与状态无关的类?我的理解是当一个类中没有属性,只有方法的的时候,就可以认为这个类是与状态无关的类。回想非静态类实例化一个对象,目的在什么地方?目的就是通过这个实例化的对象来保存类的状态。
不是吗?例如
A a = new A();
a.Name = "Kevin";
a.Sex = "男";
......
通过我们实例化的对象a,类的状态被对象a保持住了。
如果我们的类没有属性,全是方法,那么,有必要为了调用类中的方法,先实例化一个对象出来吗?
因此,笔者建议,在做类的设计的时候,如果类是与状态无关的类,建议将其设计为static类。
至于说这样做的意义:首先,省略了构造一个对象的性能损耗,虽然可以忽略不计。其次,对程序员比较友好,调用类的方法更加的方便。 - 只要一个类是与状态类无关的类,那么将其设计成静态类是没有问题的。

浙公网安备 33010602011771号