C# 如何在函数调用之间传递数据

C# 如何在函数调用之间传递数据,c#,performance,function,class,C#,Performance,Function,Class,我们可以使用类对象在函数之间传递数据。就像我有课一样 public class AddsBean { public long addId{get;set;} public int bid { get; set; } public long pointsAlloted { get; set; } public string userId { get; set; } public enum isApproved { YES, NO

我们可以使用类对象在函数之间传递数据。就像我有课一样

public class AddsBean
    {
      public long addId{get;set;}
      public int bid { get; set; }
      public long pointsAlloted { get; set; }
      public string userId  { get; set; }
      public enum isApproved { YES, NO };
      public DateTime approveDate { get; set; }
      public string title { get; set; }
      public string description { get; set; }
      public string Link { get; set; }
      public DateTime dateAdded { get; set; }
    }
我们可以调用类似于
public List getAdds(string Id)
的函数。当您需要类的所有变量时,这种方法是很好的。但是如果你只需要2到3个类变量呢

传递类的对象是不好的,因为这样会浪费内存。另一个可能的解决方案是制作不同类别的较小变量,但这并不实际

我们应该做些什么才能最好地实现动机,并根据性能实现最佳效果?

在Java中,“对对象的引用是按值传递的”。。因此,您不需要传递整个对象,只需将对象的引用传递给被调用的函数

例如:


首先,由于Java是按值传递和类型化引用的,因此无需担心内存浪费。
接下来,正如您所提到的,如果您不需要所有对象,那么传递所有对象是不好的,在某些情况下,这是正确的。由于您需要保护实例中的数据,因此可以使用不同的类粒度,例如:

class A
{id, name}
class B extends A
{password,birthday}
通过引用不同的类,您可以自己控制粒度,并为不同的客户机提供不同范围的数据

但在某些情况下,您需要使用一个实例来存储整个应用程序中的所有数据,如
hadoop
中的
configure data
,或其他与配置相关的实例


尽量选择最合适的范围

如果您确定这是问题的根源,并且不想用属性的子集定义新类,.NET提供了用于对少量相关字段进行分组的
Tuple
类。例如,
元组
按顺序包含两个整数和一个字符串

public Tuple<string, long, DateTime> GetPointsData()
{
    AddsBean bean = ... // Get your AddsBean somehow
    return Tuple.Create<string, long, DateTime>(bean.userId, bean.pointsAlloted, bean.approveDate);
}
public元组GetPointsData()
{
addsbeanbean=…//以某种方式获取您的AddsBean
返回Tuple.Create(bean.userId、bean.pointsAlloted、bean.approveDate);
}
一旦此方法超出范围,就不再有对引用的对象
bean
的活动引用,垃圾收集器将在将来的某个时候收集该引用


这就是说,除非您确定
AddsBean
类的实例对应用程序的性能有明显的负面影响,否则您不必担心。应用程序的性能受其他操作的影响可能要大得多。返回引用类型(用
class
而不是
struct
定义的类型)只传递对对象的引用,而不是对象本身的数据。

前提不正确。没有使用更多内存。嗯,除了堆栈上的一个额外引用之外。@AndrewBarber-堆栈上的一个额外引用,一旦堆栈回滚到调用方,它将再次被删除:)人们经常考虑软件的性能。我不认为这种问题(它不是问题)会损害你的软件的性能。在这种情况下,它不会消耗你的记忆。即使类中有100个字段,也不要担心读取或克隆对象。我们生活在一个记忆非常廉价的世界。就连我的手表都有128K内存,“如何在函数调用之间传递数据”这个问题的标题也不正确。在OO中,您可以改为引用方法。我认为这是一个重要的问题。可能您可以将其命名为“如何从同一类构造不同属性的列表”。“我建议你改变名称和标签,让更多的观众感兴趣。”Binsonelvose曾经是微软非常著名的开发人员,他说如果你能改进任何资源,就不要认为它便宜,因为即使你的资源占用了毫秒的额外时间,并被数百万用户使用,你也在浪费时间。这会使问题变得更糟。略微如此,但仍然如此。您已经有一个包含该数据的对象。我同意,但既然提问者提到了,我就提供一个方法@AndrewBarber我不认为他说的和我说的是一样的,我使用
extends
进行重用,但他说创建另一个,完全不同的。另外,我的方法可以提供不同的封装,比他想的要好得多。最终,我还是觉得这不好。只是其中一个误读,你是对的;这是不同的!(但仍然不理想……他应该传递对象,然后忘记它!)@AndrewBarber是的,这是大多数软件所做的,比如说
hadoop
,因为全局可读实例贯穿整个应用程序。不过,从技术上讲,这与使用另一类更少的属性基本相同。这是真的,但是C#没有很多其他选项可以从方法返回多个值。@StephenJennings您所说的是正确的,但我有一个疑问可能是我错了,因为我知道当您将对象设为类时分配给属性的内存是必需的,并且需要使用所有少数属性。@hotcoolstub如果您实例化一个对象,存储整个对象所需的内存已分配。但是,除非您同时拥有对数十万个这些对象的实时引用,否则GC将在处理完每个实例后清理内存。如果您确实有这么多实时引用,那么定义一个较小的类可能是值得的。如果这还不够,那么您就有一个专门的问题,需要确切了解您正在做什么。@hotcoolstrud但在您花费太多精力优化此特定对象所使用的内存之前,您应该确保对应用程序进行检测,以便确定这确实是您应该花费时间的地方。通过将精力集中在其他地方,您很有可能获得更大的绩效胜利。
public Tuple<string, long, DateTime> GetPointsData()
{
    AddsBean bean = ... // Get your AddsBean somehow
    return Tuple.Create<string, long, DateTime>(bean.userId, bean.pointsAlloted, bean.approveDate);
}