1.params(paramerters )是可变参数,参数个数不固定
2.可变参数不能在必填写参数前边,且可变参数只能有一个(把参数传递给一
个数组,参数个数也可以不固定,但不包含0)
public static int Sum(params int[] nums)
{
int sum1 = 0;
//for循环在循环中可以更改目标,而forreach不能
//for的应用范围比foreach广
for (int i = 0; i < nums.Length; i++)
{
sum1 += nums[i];
}
//
foreach (int i in nums)
{
sum1 += nums[i];
}
return sum1;
}
//将参数传递给一个数组,参数的个数也可以不固定,但不包括0
public static float Sum1(float[] nums)
{
float sum =0;
for(int i = 0; i<nums.Length;i++)
{
sum +=num[i];
}
return sum;
}
//除非带有默认值,就包括0了
public static float Sum2(float[] nums =null)
{
float sum =0;
for(int i = 0; i<nums ?.Length;i++)
{
sum +=num[i];
}
return sum;
}
2.ref(reference) 引用 ,指针,地址 ref是输入参数
形参的数据类型虽然是值类型,但添加ref关键字,实参向形参传递的不再是变量值,而是变量地址
向ref形参传递参数时,实参必须初始化
ref传入的变量必须初始化,但是在内部可改可不改
例:
方法声明:在方法签名中,需要在参数类型前加上ref关键字。
void ModifyValue(ref int number)
{
number = 20;
}
方法调用:调用时,也需要在参数前加上ref关键字,并且传递的实参必须先被初始化。
int num = 10;
ModifyValue(ref num);
Console.WriteLine(num); // 输出20,因为num的值在方法内被改变了
3.out(输出参数)
通常方法的返回值只能有一个,通过return返回,方法输出的结果可以有多个,return只是返回结果的一种方式,而输出参数是另外一种方式。
out 关键字适用于需要返回多个值的情况,方法可以通过 out 参数将多个值传递给调用方。
输出参数在方法内部必须赋初始值。即:out传入的变量不用初始化,但是在内部必须修改该值
向out形参传递参数时,实参不必初始化。
out 关键字在方法调用时,必须传递变量,而不能传递常量或表达式。
out 关键字用于将方法的输出参数传递给调用方。被声明为 out 的参数在方法内部必须被赋值,且在方法返回前必须赋值。
public int Method3(int a, out string x, out long y, int z)
{
x = "hello world";
y = 200;
return 100;
}
//向out形参传递参数时,实参不必初始化。
string xx = "abc";
long yy = 100;
int result = cls.Method3(0, out xx, out yy, 0);
Console.WriteLine($"xx={xx},yy={yy}");
Console.WriteLine($"返回值={result}");
//输出结果
//xx=hello world,yy=200
//返回值=100
4.in
in关键字用于将参数按只读的方式传递给方法。被声明为in的参数在方法内部不能修改,只能去读取
in关键字在方法调用时,可以传递变量,常量或表达式
public class Class1
{
public string Method4(int a, in string x, in long y, int z)
{
//x = "hello world"; // 报错
//y = 200;
return x + 100 + y;
}
}
Class1 cls = new Class1();
// 向in形参传递参数时,必须初始化。由于方法不让修改in形参,所以实参不受影响
string xxx = "abc";
long yyy = 100;
string result1 = cls.Method4(0, in xxx, in yyy, 0);
Console.WriteLine($"xxx={xxx},yyy={yyy}");
Console.WriteLine($"返回值={result1}");
//输出结果
//xxx=abc,yyy=100
//返回值=abc100100
in,ref与out关键字的区别
ref传递的参数在调用方法前必须已经被初始化;而out参数则不需要初始化,方法内部会负责初始化。
ref既可用于输入也可用于输出,意味着方法内可以读取和修改参数的值;而out主要作为输出参数,表明方法将会为这些参数赋新值。
in和out最大不同,in传递过来的参数不能修改。而out必须修改,ref可改可不改
构造函数
1.构造函数在实例化时执行
2.构造函数在执行时,先进入子类,再进入父类,依次向上,直到object对象,
出来时,先把object对象的构造函数执行完,再回到父类执行,再到子类向下。
3.base()默认调用父类无参构造函数。它充当了父类的实例
第一种:实例构造函数
public class Man
{
private int Id;
private string Name;
private string Description;
public Parent(int id, string name, string description)
{
this.Id = id;
this.Name = name;
this.Description = description;
}
}
只要创建Man的对象,它就会调用类中的实例构造函数,在实例化时传参值
Man man = new Man(1,"张三“,"个人简介");
第二种:静态构造函数
静态构造函数的特点:
静态构造函数不能使用访问修饰符,只能有静态成员
静态构造函数只执行一次不再执行
类或结构体中只能具有一个静态构造函数
静态构造函数不能继承或重载
静态构造函数会在实例构造函数之前运行
public class Class1
{
public static int count =0;
public Class1()
{
count =1;
}
static Class1()
{
count =2;
}
static void Main(string[] args)
{
Console.WriteLine("count ={0}",count);
Class1 class1 = new Class1();
Console.WhriteLine("count = {0}",count);
Console.ReaKey();
}
}
//它会先执行count =0,再执行count =2,最后执行count =1