C# 记忆变量中的值与使用返回值的函数/方法

C# 记忆变量中的值与使用返回值的函数/方法,c#,java,c++,function,memory,C#,Java,C++,Function,Memory,我已经为此徘徊了一段时间了。我还是个初学者,所以我的程序很简单,几乎不需要任何资源。我熟悉C++、java和C语言。但在未来,事情会变得更加复杂,变量和对象会更多,函数/方法也会更多 为了更改变量的值,我可以调用一个函数/方法,该函数/方法只更改一次值。之后,当我需要变量时,我必须简单地调用它。获取值所需的时间更少。如果函数做了很多工作,那么它所消耗的时间将只经历一次。但是变量需要内存中的空间,当它们的数量变得相当大时,这可能会成为一个问题 但是我可以调用一个返回所需值的函数/方法。我只需要在必

我已经为此徘徊了一段时间了。我还是个初学者,所以我的程序很简单,几乎不需要任何资源。我熟悉C++、java和C语言。但在未来,事情会变得更加复杂,变量和对象会更多,函数/方法也会更多

为了更改变量的值,我可以调用一个函数/方法,该函数/方法只更改一次值。之后,当我需要变量时,我必须简单地调用它。获取值所需的时间更少。如果函数做了很多工作,那么它所消耗的时间将只经历一次。但是变量需要内存中的空间,当它们的数量变得相当大时,这可能会成为一个问题

但是我可以调用一个返回所需值的函数/方法。我只需要在必要的地方使用变量,这意味着更少的变量。如果函数/方法很短,这不是问题。但是有些函数/方法在返回值之前必须做大量的工作。这样,程序对用户来说似乎较慢

我的问题是:记忆变量中的值还是使用返回值的函数/方法:哪个更好,何时更好,为什么更好


这个问题听起来像:高速和消耗更多的内存,而不是消耗更少的内存和低速…

您指出,有时您可以用更低的空间效率换取更好的时间效率,或者,当然,相反

哪个更好?显然,这取决于问题的答案:您可用的空间或时间少了哪些?

Bing需要在几分之一秒内搜索整个互联网;对于Bing团队来说,时间极其昂贵,空间极其廉价,因此他们总是选择时间效率高的解决方案,即使这意味着使用额外的空间

有些人研究的问题可能会消耗时间,但他们不能在机器中放入更多内存,因为机器,比如说,在环绕火星的轨道上。这些人倾向于优化空间效率,而不是时间效率


考虑到您的实际情况,您可以做出适当的权衡。在考虑实际成本之前,没有一种方法明显优于另一种方法。

< p>避免计算可以缓存的值通常是明智的,因为这样可以避免在不同的地方维护状态(如果最终忘记了,则打破一致性)。 将某些值的计算抽象出来(比如将其隐藏在函数后面)是个好主意。稍后,一旦您的代码工作正常,并且您觉得它很慢,那么就使用分析来确定热点。如果这样一个函数被证明是一个热点,那么您可以在其下面引入缓存/内存化,抽象(在理想情况下)将覆盖(函数的)客户端的讨厌细节

记忆化

记忆函数通常涉及一个查找表(基于数组、关联数组等),其中键类型是记忆函数参数的集合,存储值是函数的返回值

然后,函数将首先检查结果是否已在查找表中可用并返回它,或者在返回之前计算结果并存储它


事实上,如果编程语言支持这种抽象,那么这种记忆可以从记忆化函数中分离出来,并作为一个单独的层(包装函数)实现。在没有一流函数的语言中,这通常可以通过使用接口和单个方法类来实现。

作为标记进行面向对象编程(如C#、Java和C++)时需要记住的一点是,类应该具有紧密的内聚性和松散的耦合性

在你的问题中你说

但是有些函数/方法在使用之前必须做大量的工作 返回值

一个紧密结合的类将努力实现一个单一的、有重点的目标,并且该类中的方法也将随之产生

就可维护性和总体良好的面向对象编程而言,使用大型方法进行各种计算以返回值,而不是使用紧密内聚的封装类是一种糟糕的做法


维护一堆返回计算值的大型复杂方法,而不仅仅是在定义良好的方法中使用私有变量,这可能是开发人员最糟糕的噩梦。

如果您的问题不是特定于语言的,不要只将您能想到的每一个语言标记都发送出去;这不是建设性的。就我而言,这些是我熟悉的语言。我可以为“非语言特定的”添加标签(我不记得那个标签的名字),但是更少的人会看到它…更少的人会看到它,但是至少你的问题不会是虚伪的,并且只为真正想要回答语言特定问题的人(如我自己:-P)出现。C++中的SIDNOTE:执行一些缓慢计算的常量成员函数可以将结果缓存在可变成员中。然而,这已经相当混乱了(好吧,C++)。我期待这样的答案。但是,谢谢@当然啦。这是正确的答案。