传递对象的最佳实践

本文关键字:最佳 对象 | 更新日期: 2023-09-27 18:27:33

我有一个简单的问题。

假设我有一个大约有10个属性的数据对象,我想将数据从对象传递给函数。大多数时候,我在接收函数中只需要其中一个值,并且可以只传递该值(比如int)。那么,总是发送整个对象与只发送其中一个包含的值的利弊是什么呢?

有最佳实践吗?

传递对象的最佳实践

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

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

decimal CalculatePrice(Customer customer);

decimal CalculatePrice(decimal productPrice, int numberOfItems);

第二个更容易理解和测试。这个原理被称为德米特定律。

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

当你"传递一个对象"时,你实际上只是将引用传递给对象——所以在x86上是4字节,在x64上是8字节。因此,如果该方法感觉很自然地获取对象,只需传递对象即可;没关系。任何其他方法都可能会变得更糟。

当然,如果该方法只需要一个int,并且只能需要单个int,这感觉很"自然",那么传递int也可以

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

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

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

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

在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。

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

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