Tag: params

在C#中使用params的成本

有没有人建议在C#中使用params进行方法参数传递。 我正在考虑为前6个参数进行重载,然后使用paramsfunction进行7次重载。 我的理由是避免paramsfunction需要额外的数组分配。 这适用于一些高性能的实用方法。 任何建议? 创建所有重载是浪费代码吗?

使用params和optionals的C#方法重载

今天我发现了一些奇怪的事 我想知道为什么会这样: static void Main(string[] args) { Console.WriteLine(ExampleMethod(3)); Console.ReadKey(); } public static string ExampleMethod(int required, params int[] optionalint) { return “ExampleMethod 2”; } public static string ExampleMethod(int required, string optionalstr = “default string”, int optionalint = 10) { return “ExampleMethod 1”; } 想一想:调用ExampleMethod(3)时的结果是什么; 在我看来,它会导致不可预测的结果。 在我的情况下,总是调用方法1。 但是当我改变方法1的签名时,主方法称为方法2(当然)。 我没想到会出现这样的行为,我预料到“AmbiguousReferenceException”或者至少是编译器警告。

为SpecFlow Scenario提供多个When语句

SpecFlow相当新,所以请耐心等待。 我正在和一位同事一起基本了解你可以用SpecFlow做些什么。 我们使用了经典的FizzBu​​zz问题,我们用它来测试unit testing,以比较我们如何在SpecFlow中执行类似的问题。 我们编写了我们的场景,如下所示增长代码: (请原谅命名只是想让测试结果) Scenario: 1 is 1 Given there is a FizzBuzzFactory When you ask What I Am with the value of 1 Then the answer should be 1 on the screen Scenario: 3 is Fizz Given there is a FizzBuzzFactory When you ask What I Am with the value of 3 […]

Params后面的可选参数

所以我看到有可能有一个方法签名,其中第一个参数提供默认值,第二个参数是params集合。 我看不到的是实际使用第一个参数的默认值的方法。 它可能吗? 示例方法: void WaitAllTasks(string message = “Running Task.WaitAll”, params Task[] tasks); 我最初尝试在调用方法时省略message参数,并尝试使用命名参数,这与params不兼容。 它编译,但是可以使用它吗?

当不能简单地过载时,混合可选参数和参数

与此问题类似,我想将可选参数与params关键字混合,这当然会产生歧义。 不幸的是,创建重载的答案不起作用,因为我想利用调用者信息属性,如下所示: public void Info(string message, [CallerMemberName] string memberName = “”, [CallerLineNumber] int lineNumber = 0, params object[] args) { _log.Info(BuildMessage(message, memberName, lineNumber), args); } 在没有可选参数的情况下创建重载会更改调用站点,从而阻止这些特定参数正常工作。 我找到了一个几乎可以工作的解决方案(尽管很难看): public void Info(string message, object arg0, [CallerMemberName] string memberName = “”, [CallerLineNumber] int lineNumber = 0) { _log.Info(BuildMessage(message, memberName, lineNumber), arg0); } public void Info(string message, object arg0, […]

这个模式有名字吗? (C#编译时类型安全与“params”不同类型的args)

这个模式有名字吗? 假设您要创建一个方法,该方法接受可变数量的参数,每个参数必须是一组固定类型(以任何顺序或组合),以及您无法控制的某些类型。 一种常见的方法是让您的方法接受Object类型的参数,并在运行时validation类型: void MyMethod (params object[] args) { foreach (object arg in args) { if (arg is SomeType) DoSomethingWith((SomeType) arg); else if (arg is SomeOtherType) DoSomethingElseWith((SomeOtherType) arg); // … etc. else throw new Exception(“bogus arg”); } } 但是,让我们说,像我一样,你痴迷于编译时类型的安全性,并希望能够在编译时validation你的方法的参数类型。 这是我想出的一种方法: void MyMethod (params MyArg[] args) { // … etc. } struct MyArg { public readonly […]

params超载明显模糊 – 仍然编译和工作?

我们在代码中找到了这些: public static class ObjectContextExtensions { public static T Find(this ObjectSet set, int id, params Expression<Func>[] includes) where T : class { … } public static T Find(this ObjectSet set, int id, params string[] includes) where T : class { … } } 如您所见,除了params之外,它们具有相同的特征。 它们被用于多种方式,其中之一: DBContext.Users.Find(userid.Value); //userid being an int? (Nullable) 对我来说奇怪的是,它解决了第一次超载。 Q1:为什么这不会产生编译错误? Q2:为什么C#编译器解析了上面第一个方法的调用? 编辑 […]

C#params明显的编译器bug(C#5.0)

这是我认为昨天解决的一个post的后续内容。 昨天我在以下情况下遇到了我的代码问题: using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace ConsoleApplication3 { class Program { class Bar { int v; public Bar(int v) { this.v = v; } public override string ToString() { return v.ToString(); } } static void Main(string[] args) { Foo(1, 2, 3); Foo(new int[] { 1, 2, 3 }); Foo(new Bar(1), […]

使用params关键字重载方法

class D { public void foo(int z, int x) { Console.WriteLine(“foo with two parameters”); } public void foo(params int[] z) { Console.WriteLine(“foo with two params parameter”); } } class Program { public static void Main() { D obj = new D(); obj.foo(10,20); } } 当我运行此代码时,执行方法foo(int x, int y)而不是foo(params int[] z) 。 为什么是这样?

C#Lambda中的变量参数

是否可以使用C#lambda / delegate来获取可以使用Dynamic-invoke调用的可变数量的参数? 我在这种情况下尝试使用’params’关键字的尝试都失败了。 来自答案的工作代码更新: delegate void Foo(params string[] strings); static void Main(string[] args) { Foo x = strings => { foreach(string s in strings) Console.WriteLine(s); }; //Added to make it clear how this eventually is used 🙂 Delegate d = x; d.DynamicInvoke(new[]{new string[]{“1”, “2”, “3”}}); }