传递对象的属性与传递对象

时间:2014-03-24 16:20:45

标签: c#

假设我有一个如下所示的对象:

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;
}

这两种方法之间有区别吗?有推荐的方法吗?

感谢。

5 个答案:

答案 0 :(得分:3)

除了其他差异在第一种方法中,如果更改参数值,则调用方法中的值将保持不变,但在第二种情况下,它们将更改。

如果您传递对象并稍后在对象中添加新属性,您的消费调用仍然可以调用该方法,但对于参数,您将不得不更改调用上课也是如此。

答案 1 :(得分:3)

确实取决于问题的实际范围。

但根据得墨忒耳定律(或最少知识原则),你应该尽可能少地传递信息。

这促进了松散耦合 - 实现将仅依赖于longstring,而不是取决于longstring aaaand { {1}}。

答案 2 :(得分:2)

在后一种情况下(传递整个对象),您的调用堆栈将只有一个引用,因此更小,因此理论上更快。在前面的例子中,每个参数都需要放在一个堆栈上,并且需要将更多的参数放在堆栈上,因此理论上要慢一些。

后一种情况还允许您修改对象本身,其中传递参数对象无法修改。此外,如果需要更改并传递其他值,您需要在前面的情况下更改函数签名,而在后一种情况下请不要触摸。

答案 3 :(得分:2)

当您没有或不想创建SomeObjectModel实例时,您可能想问自己是否曾使用过该方法。

您可能也会问自己该方法是否应该是SomeObjectModel的成员,因此您不需要明确地将其传递给任何人。

这可以被认为是一个非常开放的问题,我认为其他人已经充分回答了这个问题,所以我会停在这里。我只想指出在设计该方法时还有很多其他事情要考虑。

答案 4 :(得分:1)

不同之处在于可扩展性。添加模型属性不会导致修改方法签名。