传递对象的最佳实践
本文关键字:最佳 对象 | 更新日期: 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。
两者都将服务于不同的用例。
你是否认为如果你传递一个对象,整个对象都会被复制?如果是,则不复制对象;它只是被复制的引用的值。