持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第8天,点击查看活动详情
前言:
今天我们一起学习一下关于C#中关于out关键字的使用,对于C#有着很多的关键字,我对于一个知识的学习是乐此不疲的,当我们定义的方法函数需要多个返回值的时候,out关键字就非常重要啦,out关键字和in关键字一样都是泛型修饰符,对于泛型类型参数,out 关键字可指定类型参数是协变的,而in关键字是逆变的,创作不易,点赞关注评论收藏,你的点赞是我创作的动力,也是我学习的方向。
out关键字的概念
当希望方法返回多个值时,声明 out方法很有用。使用 out参数的方法仍然可以将变量用作返回类型,但它还可以将一个或多个对象作为 out参数返回给调用方法out关键字会导致参数通过引用来传递。这与 [ref]关键字类似,不同之处在于 [ref]要求变量必须在传递之前进行初始化。若要使用 out参数,方法定义和调用方法都必须显式使用 out关键字。
扩展
out 关键字可指定类型参数是协变的。 可以在泛型接口和委托中使用 out 关键字。协变使你使用的类型可以比泛型参数指定的类型派生程度更大。 这样可以隐式转换实现协变接口的类以及隐式转换委托类型.引用类型支持协变和逆变,但值类型不支持它们。具有协变类型参数的接口使其方法返回的类型可以比类型参数指定的类型派生程度更大。 例如,因为在 .NET Framework 4 的 IEnumerable '<' T '>'类型是协变的,所以可以将 IEnumerable(Of String) 类型的对象分配给 IEnumerable(Of Object) 类型的对象,而无需使用任何特殊转换方法。可以向协变委托分配相同类型的其他委托,不过要使用派生程度更大的泛型类型参数。
//例如协变的,可以在泛型接口
interface ICovariant<out R> { }
interface IExtCovariant<out R> : ICovariant<R> { }
class Sample<R> : ICovariant<R> { }
//例如协变泛型委托
public delegate R DCovariant<out R>();
简单使用
out 关键字作为形参和实参和关键字ref比较相似,根据变量的改变而改变,我们知道ref是地址引用,但是ref是需要赋初值的,而out关键字不需要赋初值就可以引用,这就是区别,out关键词修饰的参数不能采用默认值,因为没有办法为这种参数传递有意义的默认值
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace WindowsFormsApp8
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
int[] intDatas = {11,22,33,44,55,66,77};//定义整形数组
int Max;
int Min;
int Sum;
double Avg;
string IC00;//定义变量,不赋值
IC(intDatas, out Max, out Min, out Sum, out Avg, out IC00);//调用函数,out作为参数
Console.WriteLine(Max);//输出最大值
Console.WriteLine(Min);//输出最小值
Console.WriteLine(Sum);//输出所有值的和
Console.WriteLine(Avg);//输出所有值的均值
Console.WriteLine(IC00);//输出字符串标记
}
public static void IC(int[] datas, out int max, out int min, out int sum, out double avg, out string ic00)//函数计算,函数的形参和实参类型要一致
{
max = datas[0];
min = datas[0];
sum = 0;
for (int i = 0; i < datas.Length; i++)
{
if (datas[i] > max)
{
max = datas[i];
}
else if (datas[i] < min)
{
min = datas[i];
}
sum += datas[i];
}
avg = sum / datas.Length;
ic00 = "IC00";//无return返回值,可以返回数据
}
}
}
总结
这篇文章比较简单,只是简单的学习一下,对它有更多的认识,在有需求的时候最起码有路子,虽然很简单,但是也是可以学到东西的,我们学习了新的知识,对我们的知识储备及技术又有新的一点点的进步,C#的技术就是先简单再难嘛,积少成多之后才会成长才会进步,我们要不断的学习不断的探索,才能有学习的动力,才会有学习的欲望,创作不易,点赞评论收藏关注,嘿嘿,不喜勿喷!!!!