.net 参数修饰符

时间:2022-01-14 09:49:39

参数修饰符的作用

参数修饰符 作用
如果一个参数没有用参数修饰符标记,则认为它将按值传递(pass by value),这意味着被调用的方法收到原始数据的一份副本
out 输出参数由被调用的方法赋值,因此它按引用传奇(pass by reference)。如果被调用的方法没有给输出参数赋值,就会出现编译报错
ref 调用者赋初值,并且可以由被调用的方法可选地重新赋值(因为数据是按引用传递的)。如果被调用的方法未能给ref赋值,也不会有编译错误
params 这个参数修饰符允许将一组可变数量额参数作为单独的逻辑参数进行传递。方法只能有一个parms修饰符,而且必须是方法的最后一个参数。事实上,你不会经常使用params修饰符。但要知道的是,基础类库中的许多方法都使用了C#语言特性

参数修饰符用法

out的主要作用

可以通过函数为多个参数进行赋值,这样在只有一次ruturn的前提下,可以进行对多个变量进行赋值操作。

void FillTheseParams(out int a, out string b, out SomeClass c)
{
a = 1;
b = "some string";
c = new SomeClass();
}

ref的作用

以java来说,参数其实传的都是值,只能改变其状态是不能改变其引用,.net为什么会多出来一个ref参数修饰符呢,因为.net默认是只能修改引用的内部的值,但是引用的值是不能修改的

// c# code
void Modify(SomeClass a)
{
a.SomeStringFiled = "1" // ok
a = new SomeClass() {
SomeStringFiled = "2"
}; // not ok
} void Modify(ref SomeClass a)
{
a = new SomeClass() {
SomeStringFiled = "2"
}; // ok
}

实际上,执行上述的代码是不会生效的。其实上面的代码也就相当于下面的代码

// java code
void modify(final SomeClass a) {
a.someStringField = "1"; // ok
a = new SomeClass(); // not ok,编译报错
a.setSomeStringField("2");
}
void modify(SomeClass a) {
a.someStringField = "1"; // ok
a = new SomeClass(); // not ok, 不会报错,但是也不起任何作用
a.setSomeStringField("2");
}

为了对引用值更方便的修改,.net引入了ref关键字(我猜的),毕竟java只能在方法外对变量进行引用修改,在重构等方面跟.net比起来还是差了一些。