[参考:c#说明文件中方法的使用](https://docs.microsoft.com/zh-cn/dotnet/csharp/programming-guide/classes-and-structs/methods)
# 方法及方法的参数
![](https://box.kancloud.cn/2e8a27476b5deafd96d18168be6450d0_504x266.png)
> 看到 `void` 类似字样修饰符的,就知道这个是方法了。
类中包括属性和方法。其实方法就是一个函数,便于在创建对象后直接用“.”调用。方法声明如下:
```
public int Student() //public 是权限修饰符;int 表示返回值类型。如果是 void 则是无需返回一个值;Student()为自己取的方法名。
{
//方法的主体
return 0;//因为定义为int类型,所以需要加return来回传返回值。或return “”;
}
```
调用时只需要“对象名.方法名”也就是对象名后面加一个点,就直接可以跳出方法名了。
# params
方法的参数个数不确定时,可使用params[]
params 其实是一个一维数组。
- 一个方法最多有一个 params[] 参数;
- 只能在一维数组上引用;
- 不能使用ref、out修饰 params[] 参数。
```
private int Add(params int[ ] x) // 如果知道参数个数,可写成private void Add(int i, int j, int k, int m ... )
{
}
Program pro = new Program(); //创建默认空参数的对象
int result1 = pro.Add (20);
int result2 = pro.Add(20, 30, 40, 50);
console.writeline(result1);
console.writeline(result2);
console.readline();
```
```
class Program()
{
int Add(params int[] x) //Add是一个方法的名字,而不是一个数组的名字,所以括号内的x,才是数组的名字,真实写法应该是:一维数组int x[],所以后续遍历数组时,写法应该是int x[i]
{
int result = 0;
for(int i=0; i<x.Length; i++)
{
result += x[i]; //这里不是result += i
}
return result;
}
}
static void Main()
{
Program pro = new Program();
int result = pro.Add(20, 35); // 直接调用即可,无需其他语句。
console.writeline(result);
console.readline();
}
```
# ref 可不先初始化——形参和实参
如:交换两个数的值
按引用进行传递:ref。必须初始化(与局部变量是一样的)
int num1前面加ref
```
static void Main()
{
int num1 = 98, num2 = 368;
console.writeline("before exchange, the nums are: {0}, {1}", num1, num2 );
Swap(num1, num2);
console.writeline("after enchange, the nums are: {0}, {1}", num1, num2)
console.readline();
}
//以下语句为用于交换两个数的swap方法
static void Swap(num1, num2)
{
int temp;
temp = num1;
num1 = num2;
num2 = temp;
}
```
上述代码并不会交换数值,因为swap()括号中的为形式参数。{}中的为实际参数。而对实参的修改并不会影响到形参的结果。所以按上述代码执行后,交换前后是一样的。
这时候需要在形参前加ref
```
static void Main()
{
int num1 = 98, num = 368; // 对Swap中的num1,num2 进行初始化
console.writeline("before exchange, the nums are: {0}, {1}", num1, num2);
Swap(ref num1, ref num2); // 记得加 ref
console.writeline("after exchange, the nums are: {0}, {1}", num1, num2);
consoel.readline();
}
static void Swap(ref int num1, ref int num2) // 记得加 ref
{
int temp;
temp = num1;
num1 = num2;
num2 = tepm;
}
```
按值传递 vs 按引用传递
![](https://box.kancloud.cn/e5aaae496d8f37a7d02ff95aa7e0fbeb_615x271.png)
# out 想返回多个值,或使用未经初始化的变量?
out
![](https://box.kancloud.cn/5b0fd74ee348494e24a1a7c807ef1333_371x131.png)
![](https://box.kancloud.cn/a6984b10c1f2b3b5611eb63faff49de9_250x99.png)
```
class Program
{
void Add2 (int a, int b, out int c) //如果此处未写out,则必须对c赋值
{
c = a+b;
}
static void Main()
{
Program pro2 = new Program();
int a =2, b = 3, out c;
pro.Add2(a, b, out c); //如果直接写“console.writeline(c)”,则会提示未赋值,此时加入这一行,调用Add方法,并且使用 out 修饰变量,就不会出错。
console.writeline(c);
console.readline();
}
}
```
也可以返回多个值:
比如想知道面试结果,以及是否被录用的原因:
```
void Search (int flag, out int result, out string reason)
{
if (flag == 0)
{
result = "录用";
reason = "技术能力好";
}
else
{
result = "不录用";
reason = "技术能力不行";
}
}
```
此时传回的就是多个返回值。
# 方法重载
要调用方法时,如果只是值类型不同,或者值个数不同,无需重新定义多个方法,而可以直接使用相同的方法:
```
class Add1
{
//方法的类型不同
public sring Sum1(string a, string b, string c)
{...}
public int Sum1(int a, int b, int c)
{...}
//这里两个方法的名字都叫Sum1,同名,即视为重载
}
class Add2
{
//方法的参数个数不同
public int Sum2(int a, int b, int c)
{...}
public int Sum2(int a, int b, int c, int d)
{...}
}
```
![](https://box.kancloud.cn/972239d1de6c041eae21094a3c023796_457x242.png)
# 类的静态成员
## static
如上述例子,如果在`int Sum(int a, int b, int c)`前加`static`关键字,则变成静态类。
没加static前,是实例方法,所以在调用的时候需要
`Program pro = new Program() pro.Sum(20, 30, 40)` 来创建对象,并调用方法。
如果把方法创建成静态的,那就可以直接调用类型的名字来调用
```
class Program
{
static int Sum(int a, int b, int c)
{
...
}
Program pro = new Program();
int result = Program.Sum(20, 30, 50); //此处Program也可以不写,但不能写成program.Sum(20, 30, 40),否则提示错误
int result = Sum(22, 33, 44); //不写Program也可以。
}
```
![](https://ws4.sinaimg.cn/large/006tKfTcly1fru5wz3sxpj30hs07i0tp.jpg)
无法使用实例引用来访问成员。。。请该用类型名来限定它。
- 帮助文档 microsoft helo viewer
- c#开发环境及visual studio安装注意事项
- c#程序基本结构-基本语法
- Q1: public static void main(String[] args) 是什么意思
- Q2: c#命名空间+Main方法
- Q3:注释+命名规则+代码规则
- Q4: c#语句 system => console
- Q5: 数据类型 .net
- Q5: 常用名字、变量、运算符
- Q6: 对话窗输入-属性
- Q7: 递归
- Q8:决策分支、条件判断语句 if 语句
- Q9:数组
- Q10:字符串
- Q11:对象、类、访问权限、静态动态函数
- Q12:方法及参数——继承于类
- Q13:构造函数
- Q14:继承——base 关键字
- Q15:多态、虚方法、接口
- Q16:创建窗体应用、控件
- Q17:Ado数据访问、连接 sqlserver 数据库
- Q18: 读取数据command + DataRead( )、DataSet + DateAdapter
- Q19: Entity Framwork、entity 与 ADO.net的区别
- Q20: 对话框、文件、文件夹
- Q21: 导入excel数据、更新到 dbo 数据库中
- Q26: 获取 excel 中每个 sheet 的表名
- Q22: 两个窗体之间数据+方法传递
- Q23: 数学对象
- Q24: c#网站编写
- Q25: visual studio2017如何查看帮助
- Q27: c# dictionary 字典对象
- Q28: 数组与dataTable互相转化