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的几点思考

  1. static关键字的确是面向过程开发的时代就有的关键字,但是并不代表是面向对象开发中就应该尽量避免static关键字。
  2. 静态类跟非静态类效果肯定是不一样的,区别肯定是有的。
  3. 根据笔者的经验,static类一般用于与状态无关的类。那么,什么是与状态无关的类?我的理解是当一个类中没有属性,只有方法的的时候,就可以认为这个类是与状态无关的类。回想非静态类实例化一个对象,目的在什么地方?目的就是通过这个实例化的对象来保存类的状态。
    不是吗?例如
    A a = new A();
    a.Name = "Kevin";
    a.Sex = "男";
    ......
    通过我们实例化的对象a,类的状态被对象a保持住了。
    如果我们的类没有属性,全是方法,那么,有必要为了调用类中的方法,先实例化一个对象出来吗?
    因此,笔者建议,在做类的设计的时候,如果类是与状态无关的类,建议将其设计为static类。
    至于说这样做的意义:首先,省略了构造一个对象的性能损耗,虽然可以忽略不计。其次,对程序员比较友好,调用类的方法更加的方便。
  4. 只要一个类是与状态类无关的类,那么将其设计成静态类是没有问题的。

 

posted @ 2012-03-16 00:37  cqGao  阅读(425)  评论(0)    收藏  举报