我有一个简单的问题。
假设我有一个包含大约10个属性的数据对象,并且我想将数据从我的对象传递到一个函数中。 大多数情况下,我只需要在接收函数中使用其中一个值,因此只需传递该值(比如一个int)。那么总是发送整个对象与仅发送其中一个值有何优缺点?
是否有最佳实践?
我有一个简单的问题。
假设我有一个包含大约10个属性的数据对象,并且我想将数据从我的对象传递到一个函数中。 大多数情况下,我只需要在接收函数中使用其中一个值,因此只需传递该值(比如一个int)。那么总是发送整个对象与仅发送其中一个值有何优缺点?
是否有最佳实践?
从性能的角度来看,传递整个对象没有问题。在 C# 中,你只需要传递一个对象的引用,因此不会进行复制。
但是从单元测试的角度来看,请比较以下两种方法:
decimal CalculatePrice(Customer customer);
或者decimal CalculatePrice(decimal productPrice, int numberOfItems);
第二个原则更易于理解和测试。这个原则被称为迪米特法则。
迪米特法则指出,一个对象只应该知道它真正需要的东西。因此,将完整的客户对象传递仅用于访问其Order属性会违反迪米特法则。
方法是一个专门设计的例程,其存在的目的是执行一项操作。因此,它应该接收提供所需参数的参数,既不多也不少。如果它不是在对象上运作,而是在特定的一组值上操作,则它应该将这些值作为参数输入。如果它操作整个对象,则应该将对象作为参数输入。
public class A
{
private int foo = 1;
private void DoStuff()
{
staticMethod(foo);
}
}
public static void staticMethod(int value)
{
value += 1;
}
两者都可以满足不同的用例。
你是否认为如果传递一个对象,整个对象都会被复制?如果是,不是整个对象被复制,只有引用值被复制。
当将一个对象传递给函数时,你只是传递了一个指向该对象的引用,因此这不像是一个繁重的操作。唯一被复制的是一个指针。 如果你传递一个整数,它将会被按值传递,这意味着你将会复制这个整数。
最大的区别要记住的是,当你通过引用传递时,对传入的对象所做的更改将成为该对象的永久更改。如果你按值传递,因为你进行了复制,对该参数所做的任何更改都将丢失。