C# 方法调用时params如何传入指定参数

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C# 方法调用时params如何传入指定参数相关的知识,希望对你有一定的参考价值。

我现在有一个方法是public static IhtmlString RenderJS(string attributes = "type=\"text/javascript\"", params string[] paths)。
然后我想调用这个方法,其实attributes一般都可以省略,因此采用指定参数的形式调用,AssetsHelper.RenderJS(paths: "/assets/js/html5shiv.js", "/assets/js/respond.min.js"),但是这样写报错,请问怎么写才是对的?

1. 参数数组-----params(可以将相同类型,数量可变的多个参数传给一个方法)

2. 引入:一般,参数的数量都是由目标方法声明所确定。然而,有时我们希望参数的数量是可变的。或许最好的方法是为方法传一个数组。然而,这会使调用代码变得稍微复杂一些,因为需要事先构造一个数组,再将这个数组作为参数来传递。

3. 为了简化代码,c#提供了一个特殊的关键字,它允许在调用一个方法是提供数量可变的参数,而不是由方法事先固定好参数的数量.

示例说明:上述例子中方法func可接受数量可变的参数,不管这些参数是以逗号分隔的,还是作为一个数组来传递的。为了获得这样的效果,func方法需要:(1)在方法声明的最后一个参数之前,添加一个parmas关键字。(2)将最后一个参数声明为一个数组。

  注意事项:

@1、参数数组不一定是方法声明中的唯一参数。单数必须是最后一个参数。由于只有最后一个参数才可能是参数数组,所以方法最多只能有一个参数数组。

@2、调用者可以为参数数组指定0个参数,这会造成包含0个数据项的一个数组。也可以显示地使用一个数组,而不是以逗号分隔的参数列表,最终生成的CIL代码是一样的。

@3、参数数组是类型安全的------类型必须匹配与数组指定的类型。

@4、假如目标方法的实现要求一个最起码的参数数量,请在方法声明中显示指定必须提供的参数。这样一来,假如要求的参数遗失了,就会导致编译器报错,而不需要依赖于运行时错误处理。例如:使用int max (int first,params int[] operands)而不是int max(params int[] operands),确保至少有一个值传给方法max。

参考技术A

参数 paths 就是一个 string数组,

定义一个数组传入即可。

 string[] paths=new string[2]"/assets/js/html5shiv.js", "/assets/js/respond.min.js";
            RenderJS("type=\\"text/javascript\\"", paths);

请参考并采纳,谢谢!

追问

你好,你的答案我也明白,但是能不能写成
AssetsHelper.RenderJS(paths: "/assets/js/html5shiv.js", "/assets/js/respond.min.js")

这种形式?而且attribute我想保持缺省

追答

函数定义改成这样,把有默认值的参数放后面

public static IHtmlString RenderJS(string[] paths, string attributes = "type=\\"text/javascript\\"") 

//调用
string[] paths=new string[2]"/assets/js/html5shiv.js", "/assets/js/respond.min.js";            RenderJS(paths);

追问

。。真心感谢你,这样就必须传入数组,太麻烦

追答

即有默认参数,又有可选参数。

调用的时候传个数组,能有多麻烦啊。

 

可选参数有多个,必须用数组,不然和默认参数冲突。

RenderJS(paths:new string[]"/assets/js/html5shiv.js", "/assets/js/respond.min.js");

 

可选参数只传入一个,那没关系:

RenderJS(paths: "/assets/js/html5shiv.js");

方法定义没变。

参考技术B static void MultiParams(params int[] parArr)

    Console.Write("数组包含0个元素:",parArr.Length);
    foreach(int i in parArr)
    
        Console.Write(" 0 ",i );
    
    Console.WriteLine();

static void Main(string[]  args)

    int[] arr = 1,2,3,4,5;
    MultiParams(arr);    //使用一个数组作为参数
    MultiParams(10,20);    //使用2个整数
    MultiParams(5,6,7,8);    //使用4个整数
    MultiParams()    //使用0个整数


数组参数传值很灵活的。

C#基础 可选参数调用params无参静态构造函数

C# 可选参数方法调用:

可选参数方法:

 技术图片

 

调用方式可以:

 技术图片

 

这样我们要是用age和grade的默认值这样我们就可以跳过不必要的 我们就可以指定year的值。

可选参数必须在所有必须参数之后

params可变参数一定要在最后一个

静态构造函数 没有修饰符

C#的新特征是可以给类写一个无参静态的构造函数,这种构造函数只执行一次。

编写静态构造函数的原因是,有一些静态的字段或属性在第一次使用类之前从外部初始化静态字段和属性

无参构造函数和静态构造函数可以存在同一个类中。

 技术图片

 

如果是只读成员,他就是一个不可变类型,其内容只能在初始化时设置这对于多线程非常有用,多线程可以访问用于不会改变的同一对象。因为内容不需要改变,所以不用同步。

不可变类型的一个例子就是string类。这个类没有定义任何允许改变其内容的成员。诸如Toupper(把字符串更改为大写)的方法是返回一个新的字符串。但传递到构造函数的原始字符串保持不变。

1:匿名函数只是一个继承自Object且没有名称的类,该类从初始化器中推断,类似于隐式类型化的变量。

以上是关于C# 方法调用时params如何传入指定参数的主要内容,如果未能解决你的问题,请参考以下文章

C#基础 可选参数调用params无参静态构造函数

C#泛型参数的数据结构还原?

C#调用带参动态库时一直报错?

C#线程调用方法时,怎么传参数过去

C# 用params定义一维参数数组

C#中怎么用process调用一个exe文件并传入参数?