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
猜你喜欢
blog
关于父类和子类方法发生重载的问题
其他
9584
下的规则:(1)重写方法必须和被重写方法具有相同的参数列表,返回类型必须和被重写方法的返回类型相同或者是返回类型的子类型。(2)重写方法的访问控制修饰符不能比被重写方法更严格(比如一个在父类中声明为pu
blog
算法-求和问题
数据结构与算法
12622
问题描述给定一个int类型一维数组a[],和一个int类型的数值b。编写一个程序,判断数组中有没有两个数(a[i],a[j])的和等于b,如果存在,返回两个数在a数组中的下表
blog
算法-数列求值
数据结构与算法
9802
问题描述思路:斐波那契数列的变体考虑如果把20190324项的每一项的值都算出来的话,那么值的范围就会超出基本数据类型能够表示的范围,又考虑到题目是求最后四位数,而加法计算时前一位不会影响后一位的计
blog
数据结构-图的着色问题
数据结构与算法
12867
数据结构-图的着色问题问题描述:图的m-着色判定问题——给定无向连通图G和m种不同的颜色。用这些颜色为图G的各顶点着色,每个顶点着一种颜色,是否有一种着色法使G中任意相邻的2个顶点着不同颜色?个人感
数据结构与算法
1846
约瑟夫环问题描述有m个人,围成一个环,编号为1、2、3、、、m,从第一个人开始循环报数(从1开始数),假设数到n的那个人出局,然后从下一个人继续数数(从1开始数),数到n出列,以此循环,最后那个人为
blog
mybatis入参处理的几种方法总结
框架
3778
mybatis使用接口的时候注意方法不能重载1.单个参数publicUsersselectUser(intid);selectid="selectUser"resultType
blog
算法-渗透问题
数据结构与算法
7014
问题描述:渗透问题,给一个n*m的矩阵,0为空白,1为白纸,2为墨水,墨水每经过每一秒会将上下左右相邻的白纸染成黑色,然后继续渗透,判断此图中的白纸最终是否能够全部被墨水染上色,若能需要输出所有白纸
blog
八皇后问题
数据结构与算法
7824
、同一列或同一斜线上,问有多少种摆法。1.方案1:用二维数组表示棋盘,回溯搜索/***回溯,深度优先搜索,递归*@authorLENOVO**/publicclass八皇后问题{ publicstatic
目录
没有一个冬天不可逾越,没有一个春天不会来临。最慢的步伐不是跬步,而是徘徊,最快的脚步不是冲刺,而是坚持。