标签归档.NET方法参数

关于.NET参数传递方式的琢磨

 
 年关走近,整个人既远非了劳作与写作的豪情,估计这时节多人口以及自家基本上,该接近的知心,该聚会饮酒的团圆饭喝酒,总之就是没有了劳作的思想(我出很多设法,但尽管是吃无动自己的小动作,所以自己只得看在别人当召开自我想做的从业,吃我思吃的事物。)。本人出于上个月之每周四五篇,到今天底篇章缩短到每周一篇,说个实话,现在之一样首也时有发生不思写的动机了(这同首还是咬在牙写的,感觉实在是形容不动了,写博客太折腾人矣,谁写哪个知道呀!),不过要想写出来好帮助到大家,如产生描绘的欠缺的地方,还为大家多多指正,知识在总结和自省,对别人呢本着好都是一个增高。
 

 
 这里先来同样截废话,缓和一下氛围,免得吃大家十分窘迫(太直白了要未顶好,总不能够来看好的女生就表白吧,还得多么的处,让丁觉着你沉稳有深度。),现在进来我们今天底博客内容,那就是.NET的参数用法。因为在.NET的参数用法及约束特别多,对于许多初家的话,这样丰富多彩的参数用户简直就是跟扯淡一样,即使对于是持有丰富经验的开发者来说,也不一定能生自在利用具有的参数用法及抉择适合的参数类型。谈到参数,估计很多人即使只是怀念在咱以相似的方调用中利用的那么,如string,int,object等等类型,更多的也便不曾了记忆,就是明,也就算是于遇到了重复去查看转,这样实在也远非错,毕竟非能够话费过多的时刻因此当怎么不常用的学问上,但是自个人觉得对文化或者待提前有一个到家的读,可能实际的细节无能够生好之把,但是于全局的定义还是得起一个整的攻。

 
 下面就是简单的介绍一下.NET之有的常用参数用法,如发欠缺还望指正,也接大家以脚留言讨论,分享自己的观。

一.DotNet参数概述:

   
.NET中参数(形式参数)变量是艺术还是索引器声明的均等组成部分,而实参是调用方法或者索引器时利用的表达式。

   
在CLR中,默认的情况下拥有的法子参数还是传值的。在传递引用类型的对象时,对一个目标的援会传送给艺术。这里的船引用我是为传值的方传为艺术的。这也代表方法能够修改对象,而调用者能顾这些修改。对于值类型的实例,传为艺术的实例的一个副本。意味着方法将赢得其专用的一个值类型实例副本,调用者中的实例不给影响。

   
在CLR中允许以污染引用而未传值的点子传递参数,在C#遭使用out和ref来实现传递引用的章程传值。在C#着运用out和ref来实现传递引用的措施传值,这片单举足轻重字告诉编译器生成元数据来指明该参数是招引用的,编译器将转代码来传递参数的地址,而非是传递参数本身。为值类型使用out和ref,效果同样于为传值的主意传递引用类型。 
 

    常用之参数主要有基本型参数,泛型参数,以及<in T>和<out
T>,dynamic等等。例如<in T>和<out
T>,在CLR中支持泛型类型的可变性,C#以4.0时取得了性命泛型遍体所不可不的语法,并且现在编译器也能亮接口和信托可能的换。可变性是坐相同种植类型安全的计,讲一个目标作为任何一个靶来使。可变性应用被泛型接口和泛型委托的色参数中。协变形用于为调用者返回某项操作的价值;逆变性是赖调用者想API传入值;不变性是相对于协变性和逆变性,是借助什么啊非会见起。对于当下面的文化很之长,有趣味之得自动了解,这里就是非开详细的牵线了。dynamic类型,C#举凡一律帮派静态类型的语言,在少数情况下,C#编译器要找特定的名号而休是接口。dynamic可以于编译时举行其他事,到实施时更由框架进行拍卖。有关动态类型的牵线也非开还深入的介绍。

   
在.NET中参数的运用方式要也而卜参数、命名参数、可更换多少参数等等。本文下面为是至关重要介绍就三种植参数的以方法。

二.DotNet参数用法:

   
以下是重要介绍三种参数的用法:可选参数;命名实参;传递可转换多少之参数。
  

   1.而卜参数:

     (1).基本用法:

       
如果某操作需要多单价值,而发生来值当历次调用的时候以屡次是平之,这时便可以使用可选参数。在C#先实现而换参数的功能,往往声明一个分包有或参数的办法,其他方式调用这个方法,并传递恰当的默认值。

       
在可选参数中,设计一个方式的参数时,可以为一些或整参数私分配默认值。在调用这些主意代码可以选取不指定部分实参,接受默认值。还好在调用方法时,还可由此点名参数名称的方法吗那个传递实参。如下实例:

        static void OptionalParameters(int x, int y = 10, int z = 20)
        {
            Console.WriteLine("x={0} y={1} z={2}",x,y,z);
        }

         OptionalParameters(1, 2, 3);
         OptionalParameters(1, 2);
         OptionalParameters(1);

     以上之例子可以生知的相该之所以法,int y=10及int
z=20随即片单参数就是可选参数。可摘参数的用中,如果调用时大概了一个参数,C#编译器会自动嵌入参数的默认值。向方传递实参时,编译器按自漏洞百出为右侧的一一对实参进行求值。使用已命名的参数传递实参时,编译器仍然据从左到右的依次对实参进行求值。

      (2).基本条件:

       可选取参数包含有正式,具体的一部分渴求如下:

    (a).所有可选参数必须出现于必要参数后,参数数组(使用params修饰符声明)除外,但她们要出现在参数列表的尾声,在她们前面是可选参数。

    (b).参数数组不可知声称也可摘的,如果调用者没有点名值,将下空数组代替。

    (c).可选取参数不能够使用ref和out修饰符。

    (d).可挑选参数可以吗其它项目,但对此指定的默认值却发生部分范围,那就是默认值必须也常量(数字要字符串字面量、null、const成员、枚举成员、default(T)操作符)。

    (e).指定的值会隐式转换为参数类型,但是这种转移不克是用户定义之。

    (f).可以呢计、构造器、有参属性的参数指定默认值,还好啊属于委托定有的参数指定默认值。

    (g).C#未同意省略逗号之间的实参。

     
在用可卜参数时,对于引用类型应用null来做默认值,如果参数类型是值类型,只需要动用相应的可空值类型作为默认值。

      (3).代码示例:

        /// <summary>
        /// 提取异常及其内部异常堆栈跟踪
        /// </summary>
        /// <param name="exception">提取的例外</param>
        /// <param name="lastStackTrace">最后提取的堆栈跟踪(对于递归), String.Empty or null</param>
        /// <param name="exCount">提取的堆栈数(对于递归)</param>
        /// <returns>Syste.String</returns>
        public static string ExtractAllStackTrace(this Exception exception, string lastStackTrace = null, int exCount = 1)
        {
            while (true)
            {
                var ex = exception;
                const string entryFormat = "#{0}: {1}\r\n{2}";
                lastStackTrace = lastStackTrace ?? string.Empty;
                lastStackTrace += string.Format(entryFormat, exCount, ex.Message, ex.StackTrace);
                if (exception.Data.Count > 0)
                {
                    lastStackTrace += "\r\n    Data: ";
                    lastStackTrace = exception.Data.Cast<DictionaryEntry>().Aggregate(lastStackTrace, (current, entry) => current + $"\r\n\t{entry.Key}: {exception.Data[entry.Key]}");
                }
                //递归添加内部异常
                if ((ex = ex.InnerException) == null) return lastStackTrace;
                exception = ex;
                lastStackTrace = $"{lastStackTrace}\r\n\r\n";
                exCount = ++exCount;
            }
        }

   2.命名实参:

       
 以上讲解了可选参数的一对基本概念和用法,接下去看一下命名参数的连带操作用法:

      (1).基本用法:

         
命名实参是乘在指定实参的价值时,可以同时指定相应的参数名称。编译器将判断参数的名称是否正确,并以点名的值赋给这参数。命名参数在一一实参之前增长它的参数名称以及一个冒号。如下代码:

new StreamWriter(path:filename,aooend:true,encoding:realEncoding);

 如果假定针对含有ref和out的参数指定名称,需要将ref和out修饰符放在名称后,实参之前。

int number;
bool success=int.TryParse("10",result:out number);

      (2).基本尺度:

       
在命名参数中,所有的命名参数必须放在位置实参之后,两者之间的职务不克改变。位置实参总是指于方声明遭相应的参数,不克超过了参数后,在经命名相应岗位的实参来指定。实参仍然按编制顺序求值,即使是顺序来或会见不同让参数的扬言顺序。

       
在相似情况下,可摘参数与命名实参会并配合以。可挑选参数会多适用方法的多少,而命名实参会减少用办法的多寡。为了检查是否是一定的适用方法,编译器会用位置参数的次第构建一个扩散实参的列表,然后针对命名实参和多余的参数进行匹配。如果没有点名某个必备参数,或某命名实参不能够和剩余的参数相配合,那么这艺术就是不是适用的。

     
 命名实参有时可以代表强制转换,来帮衬编译器进行重载决策。如果方式是由模块的标调用的,更改参数的默认值是颇具神秘的惊险的。可以随号将实参传给没有默认值的参数,但是编译器要想编译代码,所有要求的实参都要传递。

      
在写C#代码和COM对象模型进行互操作时,C#的可选参数与命名参数功能是极端好用底,调用一个COM组件时,为了为污染引用的方传送一个实参,C#还允许探视略REF/OUT,在嗲用COM组件时,C#要求得向实参应用OUT.REF关键字。 
  

   3.传递可易多少之参数:

     
在品种开发中,有时我们得定义一个法来获取可转移多少之参数。可以动用params,params只能采用被艺术签名中之尾声一个参数。params关键字告诉编译器向参数应用System.ParamArrayAttribute的实例。我们切实看一下贯彻之代码:

[AttributeUsage(AttributeTargets.Parameter, Inherited=true, AllowMultiple=false), ComVisible(true), __DynamicallyInvokable]
public sealed class ParamArrayAttribute : Attribute
{
    // Methods
    [__DynamicallyInvokable]
    public ParamArrayAttribute();
}


[__DynamicallyInvokable]
public ParamArrayAttribute()
{
}

   
 以上的代码可以看出该类继承自Attribute类,对于Attribute类可能无见面生,那就是是概念定制性的基类,说明ParamArrayAttribute类用于定义定制性,ParamArrayAttribute类在System命名空间下,ParamArrayAttribute类只发生一个构造方法,没有现实的兑现。AttributeUsage也定义了性能的运用方式。

   
C#编译器检测及一个方调用时,会检讨有拥有指定名称、同时参数没有采取ParamArrayAttribute的方法。如果找到一个配合的法子,编译器生成调用它所欲的代码。如果编译器没有找到一个郎才女貌的主意,会一直检查采取ParamArrayAttribute的法门。如果找到一个配合的方,编译器会士化作代码来组织一个数组,填充它的素,再生成代码来调用选定的措施。

   
调用一个参数数量可变的方式时,会造成局部分外的属性损失,数组对象要于针对达标分红,数组元素必须初始化,而且屡组的内存最终必须垃圾回收。

    提供一个主意代码,仅供参考:

        /// <summary>
        /// 字符型二维数组转换成DataTable 
        /// </summary>
        /// <param name="stringDyadicArray"></param>
        /// <param name="messageOut"></param>
        /// <param name="dataTableColumnsName"></param>
        /// <returns></returns>
        public DataTable DyadicArrayToDataTable(string[,] stringDyadicArray, out bool messageOut,
            params object[] dataTableColumnsName)
        {
            if (stringDyadicArray == null)
            {
                throw new ArgumentNullException("stringDyadicArray");
            }
            var returnDataTable = new DataTable();
            if (dataTableColumnsName.Length != stringDyadicArray.GetLength(1))
            {
                messageOut = false;
                return returnDataTable;
            }
            for (var dataTableColumnsCount = 0;dataTableColumnsCount < dataTableColumnsName.Length;dataTableColumnsCount++)
            {
                returnDataTable.Columns.Add(dataTableColumnsName[dataTableColumnsCount].ToString());
            }
            for (var dyadicArrayRow = 0; dyadicArrayRow < stringDyadicArray.GetLength(0); dyadicArrayRow++)
            {
                var addDataRow = returnDataTable.NewRow();
                for (var dyadicArrayColumns = 0; dyadicArrayColumns < stringDyadicArray.GetLength(1);dyadicArrayColumns++)
                {
                    addDataRow[dataTableColumnsName[dyadicArrayColumns].ToString()] = stringDyadicArray[dyadicArrayRow, dyadicArrayColumns];
                }
                returnDataTable.Rows.Add(addDataRow);
            }
            messageOut = true;
            return returnDataTable;
        }

  
以上被出了一个以可变换参数数量以及命名参数的使样例,完成了用二维字节数组转化为DataTable对象,将数组进行遍历,并拿数组写副datatable中,对于任何方的逻辑就是无开深入介绍,代码比较的简。

三.及参数有关的部分指导标准:

    声明方法的参数类型时,应尽量指定最弱的类,最好是接口而非是基类。

   
在设计模式的着力条件被,迪米特法则为比最少知标准化,迪米特法则是依如果少只八九不离十不肯定彼此直接通信,那么这半独像样就不应直接的相互作用。如果内部一个近似需要调用另一个接近的之一一个方法吧,可以经外人转发此调用。在近似组织的统筹上,每一个类都应尽量降低成员的访问权限。类中的耦合度越弱,越便宜复用,一个处弱耦合的近乎吃修改,不会见对发出涉嫌之切近造成波及。

   
对于参数的下受到,我们于针对参数类型的应用上,还是要好细致跟认真的错过考虑,因为当参数类型的概念及,在早晚水准上影响着我们先后的扩展性和稳定,如果参数类型的牢笼比较大,对于后续措施的壮大,意义是惊天动地的。在任何面向对象的言语系统受到,一切设计模式都是出于“多态”延伸而来,对于接口和嘱托都是当咱们面向对象设计受到动用过多底,目的较多之凡在利用时扩大参数的约束性。

   
在点子的回值类型中,返回的类应该声明也极其强之档次,以免受限于特定的品类。

四.总结:

 
 以上是一模一样首简单介绍道参数的稿子,在文章内容中要对介绍可选参数、命名参数等。以上之情而发欠缺之地方还望大家多多原谅,也可望会指出对应之题目。知识先于模范,后于反思。学习了一点继,需要我们去总结与反省,其中的内涵我们才见面生出日以及精力,以及由于能力去想。

网站地图xml地图