假设我有一个如下所示的对象:
public class SomeObjectModel
{
long TheLong {get; set;}
public string TheString {get; set;}
}
在我的代码中的某个时刻,我将此对象的一些属性传递给函数:
public void SomeFunction(long LongParameter, string StringParameter) { ... }
传递这样的参数与直接重构SomeObjectModel中的函数之间的区别(如果有的话)是这样的:
public void SomeFunction(SomeObjectModel TheObject)
{
long LongParameter = TheObject.TheLong;
string StringParameter = TheObject.TheString;
}
这两种方法之间有区别吗?有推荐的方法吗?
感谢。
答案 0 :(得分:3)
除了其他差异在第一种方法中,如果更改参数值,则调用方法中的值将保持不变,但在第二种情况下,它们将更改。
如果您传递对象并稍后在对象中添加新属性,您的消费调用仍然可以调用该方法,但对于参数,您将不得不更改调用上课也是如此。
答案 1 :(得分:3)
此确实取决于问题的实际范围。
但根据得墨忒耳定律(或最少知识原则),你应该尽可能少地传递信息。
这促进了松散耦合 - 实现将仅依赖于long
和string
,而不是取决于long
,string
aaaand { {1}}。
答案 2 :(得分:2)
在后一种情况下(传递整个对象),您的调用堆栈将只有一个引用,因此更小,因此理论上更快。在前面的例子中,每个参数都需要放在一个堆栈上,并且需要将更多的参数放在堆栈上,因此理论上要慢一些。
后一种情况还允许您修改对象本身,其中传递参数对象无法修改。此外,如果需要更改并传递其他值,您需要在前面的情况下更改函数签名,而在后一种情况下请不要触摸。
答案 3 :(得分:2)
当您没有或不想创建SomeObjectModel实例时,您可能想问自己是否曾使用过该方法。
您可能也会问自己该方法是否应该是SomeObjectModel的成员,因此您不需要明确地将其传递给任何人。
这可以被认为是一个非常开放的问题,我认为其他人已经充分回答了这个问题,所以我会停在这里。我只想指出在设计该方法时还有很多其他事情要考虑。
答案 4 :(得分:1)
不同之处在于可扩展性。添加模型属性不会导致修改方法签名。