【问题标题】:How to pass data between function calls如何在函数调用之间传递数据
【发布时间】:2014-01-06 06:20:36
【问题描述】:

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

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<AddsBean> getAdds(string Id)这样的函数。当您需要类的所有变量时,这种方法很好。 但是如果你只需要 2 或 3 个类变量呢?

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

我们应该怎么做才能最好地实现动机和最好的性能?

【问题讨论】:

  • 你的前提不正确。不使用更多内存。好吧,除了堆栈上的一个额外引用。
  • @AndrewBarber - 堆栈上的一个额外引用,一旦堆栈回滚到其调用者,它将再次被删除.. :)
  • 人们经常考虑软件的性能。我不认为这种问题(不是问题)会损害您软件的性能。在这种情况下,它永远不会消耗你的记忆。即使您在课堂上有 100 个字段,也不必担心读取或克隆对象。我们生活在一个内存非常便宜的世界。甚至我的手表也有 128 K 的内存。
  • 问题“如何在函数调用之间传递数据”的标题不正确。在 OO 中,您可以改为引用方法。我认为这是一个重要的问题。也许您可以将其命名为“如何从同一类构造不同属性的列表”。我建议您更改名称和标签以引起更多观众的兴趣。
  • @BinsonEldhose 曾经来自微软的非常著名的开发人员说,如果你可以改进它,不要认为任何资源都很便宜,因为即使你的资源花费了额外的毫秒数并被数百万用户使用,你也浪费了几分钟的时间.

标签: c# performance function class


【解决方案1】:

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

EG:

class A{
int i;
int j;
double k;
}

class B{
public static void someFunc(A a) // here 'a' is a reference to an object, we dont pass the object. 
{
 // some code
}
public static void main(String[] args){
A a = new A();
B.someFunc(a);  // reference is being passed by value
}
}

【讨论】:

    【解决方案2】:

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

    class A
    {id, name}
    class B extends A
    {password,birthday}
    

    通过引用不同的类,您可以自己控制粒度,并为不同的客户端提供不同范围的数据。

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

    尽量选择最合适的范围!

    【讨论】:

    • 这使问题变得更糟。勉强如此,但仍然如此。您已经有一个包含数据的对象。就用那个吧。
    • @AndrewBarber 我同意,但是既然提问者提到了,我只是提供一个方法!
    • @AndrewBarber 我不认为他说的和我的一样,我使用extends 重复使用,但他说创建另一个,完全不同的一个。另外,我的方法可以提供不同的封装,比他想象的要好得多。最后,我还是觉得不好。只是其中一个想法
    • 我看错了,你是对的;他们有区别! (但仍然不理想……他应该只是传递对象并忘记它!)
    • @AndrewBarber 是的,这就是大多数软件所做的,比如hadoop,作为一个全局可读的实例贯穿整个应用程序。
    【解决方案3】:

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

    public Tuple<string, long, DateTime> GetPointsData()
    {
        AddsBean bean = ... // Get your AddsBean somehow
        return Tuple.Create<string, long, DateTime>(bean.userId, bean.pointsAlloted, bean.approveDate);
    }
    

    一旦此方法超出范围,将不再有对所引用对象bean 的实时引用,并将在未来某个时间被垃圾收集器收集。

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

    【讨论】:

    • 不过,从技术上讲,这与使用另一类更少的属性基本相同。
    • 没错,但是 C# 没有很多其他选项可以从方法返回多个值。
    • @StephenJennings 你说的是正确的,但我有一个疑问可能是我错了,因为我知道当你创建类对象时分配的属性内存是需要的。跨度>
    • @HotCoolStud 确实,如果实例化一个对象,就会分配存储整个对象所需的内存。但是,除非您同时对数十万个这些对象进行实时引用,否则 GC 将在您完成每个实例后清理内存。如果您确实有这么多实时引用,那么定义一个较小的类可能是值得的。如果这还不够,那么你有一个专门的问题,需要知道你在做什么。
    • @HotCoolStud 但是在你花太多精力优化这个特定对象使用的内存之前,你应该确保检测你的应用程序,这样你就确定这确实是你应该花时间的地方.通过将精力集中在其他方面,您很有可能获得更大的绩效胜利。
    猜你喜欢
    • 1970-01-01
    • 2021-04-28
    • 2018-04-27
    • 2019-06-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多