传递方法参数的最佳内存方式

我的代码遇到了一些内存性能问题,我不确定将参数传递给我的方法的最佳方法。 我将举一个简短的例子。

我有这样的课:

class Person { public string Name { get; set; } public bool IsMale { get; set; } public string Address { get; set; } public DateTime DateOfBirth { get; set; } } 

然后我像这样使用它:

  static void Main(string[] args) { Person person = new Person { Name = "John", Address = "Test address", DateOfBirth = DateTime.Now, IsMale = false }; int age = CalculateAge(person); int age2 = CalculateAge(person.DateOfBirth); } private static int CalculateAge(Person person) { return (DateTime.Now - person.DateOfBirth).Days; } private static int CalculateAge(DateTime birthDate) { return (DateTime.Now - birthDate).Days; } 

现在在我的应用程序中,我有很多方法调用,其中整个对象(具有许多属性的对象,不像我的示例中的“Person”对象)作为参数传递,我想通过仅发送到方法来改进代码他们需要的属性,但目前我不确定这将如何提高内存性能。

关于内存使用情况如何更好,将整个Peron对象发送到我的方法,如CalculateAge(person); 或仅发送用于方法的属性,如CalculateAge(person.DateOfBirth);

首先,我认为像这样的调用CalculateAge(person.DateOfBirth); (仅作为参数发送所需的属性而不是整个对象)使用较少的内存但最终在测试后我注意到应用程序执行速度较慢,现在我不确定这些更改或其他是否会减慢我的应用程序。

这里有三种情况需要考虑:

  1. 传递class对象与另一个class对象
  2. 传递struct值与class对象
  3. 传递多个class / struct与单个class

就内存而言,第一种情况将是一个相同的交易:它需要尽可能多的内存来传递一个string Name因为它传递的是Person person

传递struct (如DateTime )可能需要更多内存或更少内存,具体取决于struct的大小。 对于DateTime ,大小(当前)为8个字节。 对于较小的按值对象,例如具有单个shortstruct ,您将需要更少的字节。 对于较大的struct ,例如DateTimeOffset ,您需要更多的字节。

在大多数情况下传递多个对象或值将比传递单个class对象需要更多内存。 唯一的例外是传递几个非常小的struct

独立于考虑内存影响,您应该在决定策略之前考虑API的逻辑结构。

Person传递给计算年龄的API会在年龄计算API和Person之间创建依赖关系。 另一方面,单独传递DOB会在Person和API的调用者之间创建依赖关系。

如果您计划将Age-computing API专门用于Person对象,那么传递Person是有意义的。 此外,您应该考虑将计算属性直接添加到Person类,

另一方面,如果您计划将年龄计算API与其他对象(动物,建筑物等)一起使用,那么最好通过DOB。

基本上,如果我没有完全错,这应该不重要。 传递给该方法的所有内容都是指向对象的指针 ,该对象在64位计算机上为8字节(请参见此处 )。

如果你可以减少你传递的对象数量 (n次为8个字节),它应该只会有所不同,但这在“标准应用程序”中永远不会成为问题。

编辑:作为@Bashn pointet out, DateTime是一个结构 ,因此在方法调用时完全复制到堆栈。 但在这种情况下并不重要,因为DateTime大8字节。 根据给定结构的大小,这可能会对方法调用产生或多或少的开销。

但是,传递参数不应该导致内存问题。 你是怎么发现自己的记忆问题的?