来看定义:
1、ref的使用:使用ref进行参数的传递时,该参数在创建时,必须设置其初始值,且ref侧重于修改;
2、out的使用:采用out参数传递时,该参数在创建时,可以不设置初始值,但是在方法中必须初始化,out侧重于输出;
注释:当希望方法返回多个值时,可以用out,并且一个方法中的参数可以有一个或多个out参数;使用out参数,必须将参数作为out参数显式传递到方法中,但是out 参数的值不会被传递到 方法中,且属性不是变量,不能作为 out 参数传递。
ref是有进有出,而out是只出不进。
有点看不懂吧
我也看不太懂,什么初值不初值的,对于我们这些刚刚接触参数的小白来说,不好理解。好吧,看个例子:
private List<ManagerInfo> SelectManager(out List<ManagerInfo> list)
{
manager.mid = Convert.ToInt32(txtMId.Text);
return list = mfacade.SelectManagerNumber(manager);
}
//在其他方法体里调用此方法的代码
……
SelectManager(out List<ManagerInfo> list);
if (list.Count > 0)
{
//员工号存在
lblmsb4.Visible = true;
txtMId.Text = "";
txtMId.Focus();
}
……
使用out可以把方法体里的某个值传出去供其他方法使用。
public void Tupian(ref PictureBox pic)
{
#region 选择图片并显示到图片框
OpenFileDialog ofd = new OpenFileDialog();
ofd.Filter = "*jpg|*.JPG|*.GIF|*.GIF|*.BMP|*.BMP|*.png|*.png";
if (ofd.ShowDialog() == DialogResult.OK)
{
//选图片
string filePath = ofd.FileName; //图片路径
FileStream fs = new FileStream(filePath, FileMode.Open);
//将图片转化为二进制
byte[] imageBytes = new byte[fs.Length];
BinaryReader br = new BinaryReader(fs);
imageBytes = br.ReadBytes(Convert.ToInt32(fs.Length)); //图片转换成二进制
//将二进制数据类型的图片导入图片框
MemoryStream ms = new MemoryStream(imageBytes);
Bitmap bmp = new Bitmap(ms);
pic.Image = bmp;
#endregion
//更新图片到数据库
string field = "picture";
byte[] value = imageBytes;
bool result = goodsfacade.UpdateGoods(goods, field, value);
}
}
使用ref可以在调用方法的过程中给参数赋值,在上面方法中用ref可以先不指明具体的picturebox,而是调用方法时在给定,这样可以实现一个方法的多次使用。
当然这两个例子这样写不太好,为了说明,用的这种写法
你看上面方法像不像一个数据工厂:ref是原材料,是需要加工的数据,out是产品,是经加工并要传出去的数据。
其实说到底,参数是为了使方法变灵活用的,有时只用单纯的参数在语法上是受限制的,这时就要用out、ref两个规则来辅助实现传值了。