ref,in,out
// 不能将in,ref,out关键字用于以下方法:
//异步方法,通过使用async修饰符定义
//迭代器方法,包括yield return 或yield break语句
//扩展方法的第一个参数不能有in修饰符,除非该参数是结构
//扩展方法的第一个参数,其中该参数是泛型类型
- ref
// ref 和In类似,但是参数是可以修改的
// 1.用于将变量传递给方法,并允许该方法更改变量的值,
// 2.使用ref关键字可以把变量作为指针传递,从而在方法内部对其修改
public class RefClass
{
public static unsafe void Init()
{
//int num; //报错
// 使用ref时的参数必须初始化并赋值
int num = 10;
Increment(ref num);
int a = 1;
ref int c = ref a;
Console.WriteLine(c);
c = 12;
Console.WriteLine(c);
// 方法内部的改变,方法外面的参数也会改变
Increment(ref c);
Console.WriteLine(c);
// 所有引用类型都是指针的包装器,因此通过引用类型标记为ref,可以将该类型视为指针,对其操作
string value = "zhangsan";
string* pValue = &value;
MethodTest(ref *pValue);
}
static void Increment(ref int x)
{
x++;
// ref表示用于返回一个变量的引用
Console.WriteLine(x);
}
static ref int IncrementArrayRef(int[] array)
{
return ref array[0];
}
//static ref int IncrementNumRef(ref int num)
//{
// // 返回值不能是null,常量,必须是变量
// // 返回值不能是方法内部定义的局部变量,可用的返回值可以来自静态字段,ref修饰的方法参数,数组参数的成员等
// //return ref num++;
//}
/// <summary>
/// ref 表示指定该方法的参数是一个引用类型
/// </summary>
/// <param name="str"></param>
/// <returns></returns>
static ref string MethodTest(ref string str)
{
// ref表示用于返回一个变量的引用
Console.WriteLine(str);
return ref str;
}
}
- in
- out