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

C# 传递对象的属性与传递对象,c#,C#,假设我有一个如下所示的对象: public class SomeObjectModel { long TheLong {get; set;} public string TheString {get; set;} } public void SomeFunction(SomeObjectModel TheObject) { long LongParameter = TheObject.TheLong; string StringParameter = TheObje

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

public class SomeObjectModel
{
   long TheLong {get; set;}
   public string TheString {get; set;}
}
public void SomeFunction(SomeObjectModel TheObject)
{
    long LongParameter = TheObject.TheLong;
    string StringParameter = TheObject.TheString;
}
在代码中的某个时刻,我将此对象的一些属性传递给函数:

public void SomeFunction(long LongParameter, string StringParameter) { ... }
传入这样的参数与重构函数以直接接收这样的对象模型之间有什么区别(如果有的话):

public class SomeObjectModel
{
   long TheLong {get; set;}
   public string TheString {get; set;}
}
public void SomeFunction(SomeObjectModel TheObject)
{
    long LongParameter = TheObject.TheLong;
    string StringParameter = TheObject.TheString;
}
这两种方法有区别吗?有推荐的方法吗


谢谢。

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


如果您传递对象,然后在对象中添加新属性,您的消费调用仍将能够调用该方法,但对于参数,您还必须更改调用类。

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

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

后一种情况还允许您修改对象本身,其中无法修改作为传递参数的对象。此外,如果需要更改并传递附加值,则在前一种情况下需要更改函数签名,在后一种情况下保持不变。

这实际上取决于问题的实际领域

但根据德米特定律(或最少知识原则),你应该传递尽可能少的信息


这促进了松散耦合-实现将只依赖于
long
string
,而不是依赖于
long
string
aa和
SomeObjectModel

,您可能想问问自己,当您没有或不想创建,SomeObjectModel实例

您可能还会问自己,该方法是否应该是SomeObjectModel的成员,因此不需要显式地传递任何信息


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

堆栈的性能可能很小,甚至无关。是的,的确如此。这就是为什么在这两个地方我都说“理论上”。除非它是一个每秒被调用数百万次的函数,否则我不会保留它作为设计考虑。旁注:你的问题很好,不需要添加+1。对于问题中的示例来说,这是一个很好的观点(看起来像是通过了某个域模型)。请注意,有一种重构方法可以将许多方法参数扭曲成单个对象,但这种方法不适用(但在这种情况下,所有属性都可能是只读的)。