c#方法参数传值问题
值类型的传值参数
方法执行时会为实参创建一个副本,方法内改变形参的值时不会改变实参的值。
引用类型的传值参数
方法会为实参创建一个副本引用,形参和实参指向的是同一个对象的内存地址,当形参引用的内存地址改变时不会改变实参引用对象的内存地址。
值类型的引用参数
这种情况下形参和实参引用的时同一个内存地址,在方法内改变形参的值就是改变实参的值。案例如下:
namespace ConsoleApplication3
{
class Program
{
static void Main(string[] args)
{
int a = 10;
test(ref a);
Console.WriteLine(a);
Console.Read();
}
static void test(ref int a)
{
a = 100;
}
}
}
结果打印100
引用类型的引用参数
引用参数并不创建引用的副本,形参和实参是同一个引用。案例:
namespace ConsoleApplication3
{
class Program
{
static void Main(string[] args)
{
A a = new A(1);
test(ref a);
Console.WriteLine(a.age);
Console.Read();
}
static void test(ref A a)
{
a = new A(2);
Console.WriteLine(a.age);
}
}
class A
{
public int age;
public A(int age)
{
this.age = age;
}
}
}
结果打印2 \n 2
值类型的输出参数
namespace ConsoleApplication3
{
class Program
{
static void Main(string[] args)
{
int a = 100;
bool b=test(out a);
Console.WriteLine(a);
Console.Read();
}
static bool test(out int a)
{
a = 1;
return true;
}
}
}
输出1
引用类型的输出参数
和值类型的引用参数相似
namespace ConsoleApplication3
{
class Program
{
static void Main(string[] args)
{
A a;
bool b=test(out a);
Console.WriteLine(a.age);
Console.Read();
}
static bool test(out A a)
{
a = new A(2);
return true;
}
}
class A
{
public int age;
public A(int age)
{
this.age = age;
}
}
}
数组参数
namespace ConsoleApplication3
{
class Program
{
static void Main(string[] args)
{
int b=test(1,2,3,4);
Console.WriteLine(b);
Console.Read();
}
static int test(params int[] a)
{
int res=0;
for (int i = 0; i < a.Length; i++)
{
res += a[i];
}
return res;
}
}
}
具名参数
具名参数的参数顺序不受参数列表的约束。
namespace ConsoleApplication3
{
class Program
{
static void Main(string[] args)
{
test(age:12,name:"abc");
Console.Read();
}
static void test(String name,int age)
{
Console.WriteLine(name + ":" + age);
}
}
}
可选参数
可选参数具有默认值
namespace ConsoleApplication3
{
class Program
{
static void Main(string[] args)
{
test();
test(age: 12);
test(age:12,name:"abc");
Console.Read();
}
static void test(String name="sdf",int age=10)
{
Console.WriteLine(name + ":" + age);
}
}
}
扩展方法
当无法对一个数据类型的源码进行修改的时候可以通过扩展方法对目标数据类型追加方法。
namespace ConsoleApplication3
{
class Program
{
static void Main(string[] args)
{
//想为double添加一个保留n位小数的方法
double d = 0.123456;
d=d.test(2);
Console.Write(d);
Console.Read();
}
}
static class A
{
public static double test(this double a,int d)
{
return Math.Round(a, d);
}
}
}
输出0.12
fixed
没有一个冬天不可逾越,没有一个春天不会来临。最慢的步伐不是跬步,而是徘徊,最快的脚步不是冲刺,而是坚持。