传递对象的最佳实践

时间:2012-03-13 12:49:08

标签: c#

我有一个简单的问题。

假设我有一个包含大约10个属性的数据对象,我想将数据从我的对象传递给函数。 大多数时候我只需要接收函数中的这些值中的一个,并且也可以只传递该值(假设为int)。那么总是发送整个对象与仅发送一个包含的值之间的优缺点是什么?

有最好的做法吗?

6 个答案:

答案 0 :(得分:12)

从性能角度来看,传递整个对象没有问题。在C#中,您只传递对象的引用,因此没有复制。

但是从单元测试角度比较以下两种方法:

decimal CalculatePrice(Customer customer);

decimal CalculatePrice(decimal productPrice, int numberOfItems);

第二个更容易理解和测试。这个原则称为Law Of Demeter.

德米特定律指出,物体应该只知道它真正需要的东西。因此,仅传递完整的Customer对象以访问其上的Order属性违反了Demeter法则。

答案 1 :(得分:10)

当你“传递一个对象”时,你实际上只是将引用传递给对象 - 所以x86上有4个字节,x64上有8个字节。因此,如果方法对于获取对象感觉很自然,那么只需传递对象;没关系。任何其他方法可能会更糟

当然,如果感觉“自然”该方法只需要一个int,并且只能 需要单个int,那么传递{{ 1}}很好

我的观点是:编写方法来支持对方法有意义的方法。

答案 2 :(得分:4)

方法是一种专门构建的例程,其存在是执行一个操作。因此,它应该采用的参数不会提供它所需要做的事情,也不会少于它所要做的事情。如果它不对某个对象进行操作,而是对一组特定的值进行操作,那么它应该将这些值作为参数。如果它作为一个整体在对象上运行,那么它应该接收对象。

答案 3 :(得分:1)

两者都将用于不同的用例。

你是否认为如果传递一个对象,整个对象将被复制?如果是,则不复制该对象;它只是复制的引用的值。

答案 4 :(得分:1)

将一个对象传递给一个函数时,你只是将一个引用传递给该对象,所以它不像是一个繁重的操作。唯一被复制的是指针。 如果你传递一个int,它将通过值传递 ,这意味着你将复制一个int。

要记住的最大区别是,当您通过引用传递时,对传入的对象所做的更改将是对象的永久更改。如果您按值传递,因为您复制了该参数的任何更改都将丢失。

答案 5 :(得分:1)

在c#中发送对象时,如果它是引用类型,则只传递引用。 但是,如果它是值类型(例如,int),则将复制该值。

因此,如果要修改对象中包含的int,则仅发送int将导致对象中包含的int未被修改。

考虑一下

public class A
{
    private int foo = 1;

     private void DoStuff()
     {
     staticMethod(foo);
     }
 }

 public static  void staticMethod(int value)
 {
      value += 1;
 }

最后,foo仍然值1,而不是2.