关于传递许多参数

时间:2008-12-02 04:30:42

标签: c# .net asp.net .net-2.0

我有大约8-9个参数传入一个返回数组的函数。我想知道直接在函数中传递这些参数或传递数组更好吗?这将是一个更好的方式,为什么?

10 个答案:

答案 0 :(得分:12)

如果我会做任何事情,那么就是创建一个包含所有参数的结构,以获得更好的智能和强大的名称。

public struct user 
{ 
    public string FirstName; 
    public string LastName; 
    public string zilionotherproperties; 
    public bool SearchByLastNameOnly; 
} 
public user[] GetUserData(user usr) 
{ 
    //search for users using passed data and return an array of users. 
} 

答案 1 :(得分:6)

单独传递,因为:

  • 这是类型安全的方式。
  • IntelliSense将在Visual Studio中提取它,当您编写调用函数时,您将知道它是什么。
  • 以这种方式执行会更快。

如果参数确实是数组,那么传递数组。例如:

对于看起来像这样的函数,请使用以下表示法:

Array FireEmployee(string first, string middle, string last, int id) {...}

对于看起来像这样的函数,请使用数组:

Array FireEmployees(Employee[] unionWorkers) {...}

答案 2 :(得分:4)

Martin Fowler的重构书中引入参数对象重构涵盖了您的场景。这本书非常值得拥有,但对于那些没有这本书的人来说,重构的描述是here。还有publisher's site和Google图书上的预览。它建议不使用数组替换参数,而是替换新对象。

答案 3 :(得分:3)

关于Skeets评论我上面的例子,他会使用一个类而不是一个结构,并且可能更清楚地在哪里使用一个类以及在哪里使用一个结构我也发布它。我想还有其他人对此也很好奇。

我可以看到使用类的主要原因是你可以使它成为不可变的,但结构也是如此?

例如:

struct user 
{ 
public user(string Username, string LastName) 
{ 
    _username = Username; 
} 
private string _username; 
public string UserName { 
    get { return _username; } 
} 

}

我很长一段时间都觉得,当我们可以拥有属性,初始值设定项,字段以及类在结构中具有的所有内容时,我现在不再了解类和结构之间的差异。我知道类是引用类型,结构是值类型,但在上面的例子中,当它用作函数中的参数时会有什么不同?

我在网站http://www.startvbdotnet.com/oop/structure.aspx上找到了这种差异的描述,而这些描述正是我在脑海中映射的原因:

  

结构可以定义为工具   用于处理一组逻辑   相关数据项。他们是   用户定义并提供方法   包装不同的数据   类型。结构非常相似   类。像Classes一样,他们也可以   包含字段和成员等成员   方法。主要区别   类和结构是,类是   引用类型和结构是   价值类型。实际上,   结构用于较小的   没有的轻量级对象   坚持很久,并使用课程   对于预期的较大对象   长期存在于记忆中。

也许这应该是一个自己的问题,但是当我们对结构与类 - 事物作为参数有不同观点时,我觉得它是相关的。

答案 4 :(得分:2)

我假设您使用的是C#4,只能使用命名参数:

FireEmployee(
    first: "Frank",
    middle: "",
    last: "Krueger",
    id: 338);

这使代码几乎与VB或Smalltalk一样可读。 : - )

如果没有,我会选择Dave Markle所说的话。

答案 5 :(得分:2)

如果这是一个看起来很有用的库代码,并且如果某些参数的典型值是默认值的候选值,那么你应该考虑Dave Markle的建议,并提供一个过载选择,参数越来越少。这是Microsoft框架设计指南中建议的方法。

或者,您可以通过使用成员初始化程序设置默认值并使用ctor重载的进程来获得与Stefan方法类似的效果。

答案 6 :(得分:1)

如果你真的不想单独传递你的参数,我建议创建一个封装所有参数的新类。您可以(在Java中,很可能在C#中)在包含gnarly方法的类中声明一个公共内部类。这样可以避免让类浮动,这些类实际上只是辅助类型。

答案 7 :(得分:1)

我想说也可以单独传递它们。我不喜欢创建一个类的想法,然后将该类作为参数传递。它是一种印章耦合形式,这意味着由于一个类使用另一个类,因此更改将更难。重用一个类意味着你必须重用另一个类。

你可以使用一个接口来减少印章耦合,但这对我的口味来说是太多的开销,所以这就是我喜欢单独传递参数的原因。

答案 8 :(得分:0)

单个功能真的需要8-9个参数吗?在我看来,如果你需要那么多参数,那么你可能在该函数中做了太多不同的事情。尝试将代码重构为单独的函数,以便每个函数都有一个目的。

答案 9 :(得分:-1)

除非函数作用于数组,否则不要将它们作为数组传递,我不会创建新的数据结构来按以下方式对参数进行分组

  1. 传递新的数据结构隐藏了函数真正需要的输入(是否需要所有数据结构/部分?)

  2. 与1相关,它使得UT变得更加困难(编写UT时需要重新创建整个数据结构)

  3. 如果输入参数不相关,您最终会得到一个新的数据结构,该结构将不相关的数据类型分组,除了使函数调用看起来更整洁之外

  4. 如果您选择将新数据结构传递给您的函数,则该函数不能在定义新数据结构的范围内使用

  5. 将每个参数传递给函数的唯一缺点是你可能无法在一行代码中使用该函数,但是在函数调用之前不要忘记你需要的行你的数据结构。