C#函数的初步解析
1.函数的组成
一个函数通常包含:访问修饰符、关键字、返回类型、函数名、参数
示例:
Public static string Read(string name) { /……..具体方法………/ Return "字符串类型" ; }
Public :为访问修饰符 在C#中分为五种访问修饰符分别为
Public |
公有访问.不受任何限制 namaspace和enum成员,interface的成员隐式的具有public修饰符不能再显示添加其修饰符 |
Private |
私有访问.只有同一个class或struct中能被访问 class或struct中的成员不加修饰符默认是private |
Protect |
保护访问.仅限于当前class或继承的class (声明class,struct前是不能加protected修饰的,只能用public或internal) |
Internal |
内部访问.仅限于当前程序集,即同一个project中 class,struct,interface如果不加修饰符默认是internal (如果class,struct是在一个class中声明的也可以protected,private修饰) |
Protect internal |
内部保护访问.同一个程序集或继承的子类可访问 (由于struct 是不能继承的,所以它的成员也不能由protected和protected internal修饰) |
注意:派生的class可访问性不能比基类更高,也就是说如果基类被internal修饰则子类只能用internal修饰,如果基类都public修饰子类可用internal也可以用public
除了权限修饰符之外,还有四个修饰符sealed,abstract,virtual,partial(这四个修饰符可以和上面五个权限修饰符一起用,写在权限修饰符前面或后面都可以)
Sealed 只能用来修饰class 表示class不能被继承
Abstract 可用来修饰class和class中的成员,但必须是class被abstract修饰了 .成员才能被abstract修饰,表示此class是抽象类,不能实例化,必须被继承并重写抽象函数
virtual只能用来修饰class中的函数,表明是虚函数,虚函数除了可以被重写外其他时候跟一般函数一样,虚函数重不重写是可选的,不是必须的
partial可以把一个class分开来写,可以在一个project中的不同文件中,在一个class特别大,由几个人合作写时,这个功能特别有用
2.tatic 表示为静态函数
在C#中大体分为静态函数和实例函数 它们在其它类中的方法调用不同
静态函数:类名.方法名
Class Read { Public static void test(){} }
调用这个函数 Read.test() ;
实例函数: 先实例化对象,然后再调用
Class Read { Public void test(){} }
调用这个函数 Read read = new Read();
read.test();
3.string 表示返回数的类型 ,若无返回数 则为void
4.Read函数名,一般采用PascalCase方式来命名,即每个单词的第一个字母大写
5.string name 传递进函数的参数,可以有多个也可以没有
多个参数的传递的
Class Read { Public void test (int a , int b ,int c ,params int[] d ){} }
其中params 表示 使用不定个数的参数
示例:
Class program { Static int SumVals (params int[] vals) { Int sum = 0; Foreach(int val in vals) { Sum+=val; } Return sum ; } Static void Main(stirng[] args ) { Int sum = SumVals(1,5,2,9,8); Console.WriteLine ("Summed Values = {0}",sum); Console.ReadKey(); } }
在参数中还有一些修饰符比较重要,如ref和out
ref:
Class test { Static void ShowDouble(int val) { Val = val*2; Console.writeLine("val doubled = {0}",Val); } Static void Main(sting[] args) { Int myNumber =5 ; Console.WriteLine("myNumber = {0}",myNumber); ShowDouble(myNumber); Console.WriteLine("myNumber={0}",myNumber); } }
输出到控制台,我们发现结果如下:
myNumber = 5
Val = 10
myNumber = 5
从上面我们可以发现myNumber的值,在调用函数后并没有发生变化,为了改变这种现象,我们可以使用几种方法
,如使ShowDouble函数带有返回值
Static int ShowDouble(int val) { Val = val*2; Return Val; }
我们这里讲解第二种方法.使用ref修饰符
ref的作用是:使函数处理的变量与函数中调用的变量是同一个变量,而不仅仅只是值相同。因此,我们可以对ShowDouble函数进行以下修改
Class test { Static void ShowDouble(ref int val) { Val = val *2; Console.writeLine("val doubled = {0}",Val); } Static void Main(sting[] args) { Int myNumber =5 ; Console.WriteLine("myNumber = {0}",myNumber); ShowDouble( ref myNumber); Console.WriteLine("myNumber={0}",myNumber); } }
输出为:
myNumber =5 ;
Val = 10;
myNumber = 10 ;
输出参数OUT
OUT修饰符与ref修饰符的执行方式完全相同,但是还有一些重要的区别:
把未赋值的变量用作ref参数是非法的,而只有把未赋值的参数用于OUT才是正确的,若参数赋了值,out也只把它当做未赋值的数进行处理
Class Test { Static int MaxValue(int[] intArray,out int maxIndex) { Int maxVal = intArray[0]; maxIndex = 0 ; For(int i=1;i<intArray.length;i++) { If(maxVal<intArray[i]) { maxVal=intArray[i]; maxIndex = I ; } } Return maxVal; } Static void Main(string[] args) { Int[] myArray = {1,8,3,6,2,5,9,3,0,2}; Int maxIndex ; Console.WriteLine("The maxinum value in myArray is {0}",MaxValue(myArray,out maxIndex)); Console.WriteLine("The first occurrence of this value is at element{0}",maxIndex+1) } }