将字符串vs类对象作为参数传递给函数

时间:2014-04-09 06:58:28

标签: c# function arguments

我需要将两个值传递给Function

这两个值都在Object

类中

我有两个选择

  1. 将所需值传递为字符串
  2. 传递类对象
  3. 问题:类对象除了我想要的内容之外还有很多成员

    问题:哪个是最佳选择?

    实施例

    此功能用于数据库查询

    FunctionName(string opt1,string opt2) 
    {
        using (SqlConnection connection = this.Connection)
        {
            connection.Execute("select count(*) from table where opt1 = opt1 and opt2 = opt2", new { opt1 = opt1, opt2 = opt2 });
        }
    }
    

    FunctionName(className obj)
    {
        using (SqlConnection connection = this.Connection)
        {
            connection.Execute("select count(*) from table where opt1 = opt1 and opt2 = opt2", new { opt1 = obj.opt1, opt2 = obj.opt2 });
        }
    }
    

    函数调用如下所示

     class className {
     public string opt1;
     public string opt2;
     public string opt3;
     public string opt4;// and more
     }
    
     className obj1
    
     FunctionName(obj1.opt1,obj1.opt2) Or
     FunctionName(obj1) 
    

2 个答案:

答案 0 :(得分:2)

3 - 传递专为此工作而设计的新类/结构:)

但是,如果您只关心效率而不是安全性,那么传递类引用并不取决于该类有多少字段。传递一个没有字段的类所花费的时间与传递具有100 MiB数据的类完全相同。除非它是struct

不要将类序列化为字符串,而是将其再次传递给方法。这只是个坏主意。你失去了类型安全性,它会很昂贵,并且编译器会丢失很多选项来警告你你做错了什么。

当然,如果您只是传递参数,这无关紧要。这可以带来一些好处,主要是确保(只要你不使用任何可变引用类型)你也将保持线程安全,并且它限制了可能的副作用(例如,修改传递的类 - 它不是副本,它是同一个实例;再次,除非你传递struct)。

答案 1 :(得分:1)

我会说这是基于意见的,但我仍会尝试回答:我的经验法则是,如果参数很少(不超过三个 - 最好不超过两个),那么参数可以直接传递。仅仅因为在大多数情况下这是最简单的解决方案。

如果你有三个以上的参数,你应该考虑添加一个类只是为了清楚明了。但是,正如您所指出的那样,您可能不希望传递具有大量额外值的类。如果是这样,您有几个选择,例如:

  • 专门为此目的创建一个新类,它具有您需要传输的成员
  • 创建主类可以继承的新基类,并将要公开的成员移动到此类中。保留您不希望在原始课程中公开的成员。现在,您可以使用所需的内容传递新的基类,并在内部使用子类,以及您的函数不需要了解的额外内容。