方法是具名的语句序列,如果学过其他编程语言,比如c,c++,可以将方法视为与函数相似的东西.
声明方法
声明c#方法的语法如下:
returnType methodName(ParameterList)
{
//主体语句
}
returnType是类型名称,指定方法返回的数据类型,比如int,string.如果没有返回值,要使用void.
methodName是调用方法时所用的名称,这个名称同样要遵循标识符命名规则.
方法名最好使用骆驼命名法,比如displayCustomer
parameterList(参数列表),可选,描述了允许传给方法的数据的类型和名称。在圆括号内填写参数列表时,先写类型名,再写参数名。
…
…
…
使用方法
下面是一个使用方法的例子
注意,必须显示指定方法的参数类型和返回类型.
注意,如果方法不是静态的,必须生成实例后才能调用。
如果你学过C或者C++等语言,可能会疑惑为什么不能调用,
因为c#不支持全局方法,所有方法必须在类的内部,如果不是静态的话,则必须生成类的实例后,才能调用类的方法
有两种方法:
第一 生成类的实例,在这个例子中就是Program类,然后调用。
第二让方法变成静态,直接调用.
…
…
…
使用表达式主体方法
有的方法十分简单,就是执行单一任务或返回计算结果,这种情况下可以简写,使用=>操作符引用构成方法主题的表达式,
比如:
没有return语句。
表达式的值自动作为返回值,如果表达式不返回值,则为void方法
类似这样的设计称为语法糖,代码更易读,程序更清晰。
…
…
…
从方法返回多个值
有时候想从方法返回多个值,比如整数除法,可以一次性返回商和余。
这可通过返回元组(tuple)实现。元组就是一个小的值的集合。
使用方法如下:
…
…
…
使用作用域
创建变量的目的是容纳值,变量有效期始于定义位置,终于方法结束时。方法执行完毕,变量随之消失。
某变量能在程序特定位置使用,就说该变量在那个位置“处于作用域内”.
总而言之,变量作用域是指该变量能起作用的程序区域。
定义局部作用域
{}大括号定义了方法作用域。
方法主体声明的任何变量都具有那个方法的作用域;方法结束,它们随之消失。这种只能由方法内部的代码访问的变量叫做局部变量,不能利用局部变量在不同方法之间共享消息。
定义类作用域
在类声明的任何变量都具有那个类的作用域,类定义的变量称为字段。比如:
可以看到没有任何的报错。变量myfield在类内部定义,可由类的所有方法使用.
重载方法
以Console类的WriteLine方法为例,
重载是一项十分有用的技术,可以针对不同数据类型或不同信息组别执行相同的操作。编译器根据实参数量和类型来选择匹配的重载版本,注意,不能声明仅仅返回类型不同的两个方法。
…
…
…
重构代码
有时要在应用程序的多个位置写相同或者类似的代码,这时可选定并右击输入的代码块,从弹出菜单中选择“快速操作和重构”,在单击”提取方法“。所选的代码会移动到一个名为NewMethod的新方法
…
…
…
使用可选参数和具名参数
定义可选参数
指定可选参数是在定义方法时使用赋值操作符为该参数提供默认值。
比如:
void oneMethod(int first, double second = 0.0,string third = "Hello")
可选参数只能放在必需参数之后,一般地,函数的形参入栈是由左至右入栈,排第一的形参被第一个压入栈里,成为栈底元素,关键点就这里,因为形参的第一个参数必须是确定的,由此,编译器系统才可以对函数开辟一个保存形参的栈区,然后第一个之后的元素陆续入栈。如果是把可选的参数排在前面,由于它是不确定的,编译系统无法预知何时才会需要对函数开辟一个保存形参的栈区。因此必须放在最后。
调用如下:
optMethod(99, 123.45, "World");
optMethod(100, 54.321);
传递具名参数
c#默认根据每个实参在方法调用中的位置判断对应的形参,
比如
optMethod(99, 123.45, "World");
99对应了first,123.45对应了second,"World"对应了third.
c#还允许按名称指定参数。
比如
optMethod(first : 99, second: 123.45, third: "World");
optMethod(third: "World",second : 123.45,first : 99);
具名参数允许实参按任意顺序传递。
还允许省略实参
optMethod(first : 99, third: "World");
消除可选参数和具名参数的歧义
上面调用哪个a方法呢?
答案是调用最匹配的.最后选择3个参数的版本,而不是四个参数的.
如果类似这种,会造成二义性,不允许编译。