【问题标题】:Best approach to pass information to a function [closed]将信息传递给函数的最佳方法[关闭]
【发布时间】:2017-01-12 07:59:45
【问题描述】:

将信息传递给函数的最佳方法是什么?我们应该传递参数列表吗?或者我们应该创建一个类并只传递该类的实例,这样每当参数列表发生变化时,我们就不必更改所有流程?

传递类变量:

public class FooParams
{
    string Name{get;set;}
    string Password{get;set;}
}

public void GetFoo(Foo foo)
{
}

传递参数列表

public void GetFoo(string name, string password)
{
}

【问题讨论】:

  • 这取决于......
  • 这里为什么有C++标签?
  • @UnholySheep 这是关于一般编程实践的,但我找不到任何标签,所以为了接近更多的观众以获得更好的答案,我只是添加了两个标签:)
  • 这个问题的答案取决于语言 - 所以为完全不相关的语言添加标签是个坏主意。

标签: c#


【解决方案1】:

这里有很多事情需要考虑。
这取决于上下文、参数数量、可读性、不变性,甚至是个人偏好

这里只是几个需要考虑的情况:

  • 如果您传入的只是简单的stringint 参数,那么也许您应该像void foo (string s, int i) 一样传递它们

  • 如果您需要对这些值进行可变性,那么您可以将它们包装在一个类中并传入。

  • 如果这些参数总是放在一起,那么考虑将它们包装在一个类或结构中:

    void foo(int height, int width)
    void foo(Size size)
    
  • 如果有许多不同的参数,您可以考虑将它们包装在一个或两个 DTO 中并传递它以获得更好的可读性。例如:

    void SendTo (string firstName, string LastName, string street, int apartmentNumber, string City)
    void SendTo (Person person, Address address)
    

【讨论】:

    【解决方案2】:

    您不应该仅仅为了将参数捆绑到单个对象中而创建类/结构,除非您希望在其他地方使用该参数对象。在您的示例中,如果仅针对单个方法,则在设计和性能方面使用参数都是最简单的:

    public void GetFoo(string name, string password)
    {
        /// Do stuff
    }
    

    但是,如果这是可以相互操作的方法库的一部分,那么您可以考虑将结构体作为信息持有者。 (简单地说,这就是 Point 结构在 System.Drawing 命名空间中的用途。)

    (我应该指出,虽然使用参数而不是类/结构确实对性能更好,因为程序执行速度更快,占用内存更少,但实际差异完全可以忽略不计. 但是,设计方面仍然是一个有效的问题。)

    【讨论】:

      【解决方案3】:

      IMO,在您的情况下,传递参数列表是一种方法,有时您希望生成编译时错误,而不是在添加某些内容时寻找所有用法。

      如果您有大量参数,那么您可以创建一个struct 以便按值复制(不需要类 - 引用类型)。

      您正在寻找的替代 FooParams 的是可选参数:

      public void GetFoo(string name, string password, int somethingNew = 0)
      {
      }
      

      通过使用可选参数,您实际上可以指定该函数的强制和可选参数。例如,通常使用这种方法而不是实现和维护六个重载。

      【讨论】:

      • 你说的是c++还是c#?
      • 如果它是可变的,你可能想要一个类。 msdn.microsoft.com/en-us/library/ms229017.aspx
      • @AsadMehmood C#,这是您在问题中使用的语法。
      • 您以“IMO”开头。这就是我投票结束这个问题的原因:)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-02-04
      • 1970-01-01
      • 2023-03-22
      • 2011-10-18
      • 2022-01-25
      • 2016-07-06
      • 1970-01-01
      相关资源
      最近更新 更多