我有一个简单的问题。
假设我有一个包含大约10个属性的数据对象,我想将数据从我的对象传递给函数。 大多数时候我只需要接收函数中的这些值中的一个,并且也可以只传递该值(假设为int)。那么总是发送整个对象与仅发送一个包含的值之间的优缺点是什么?
有最好的做法吗?
答案 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.