gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-30 01:02:09 25 4
gpt4 key购买 nike

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

例如我有这个类:

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,大小(当前)为八个字节。对于较小的按值对象,例如带有单个 shortstruct,您将需要更少的字节。对于较大的 struct,例如DateTimeOffset,您将需要更多字节。

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

在决定策略之前,除了考虑内存影响之外,您还应该考虑 API 的逻辑结构。

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

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

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

关于c# - 内存传递方法参数的最佳方式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34932132/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com