请原谅我提出一个难以理解的问题。
请考虑以下代码:
public class SampleClass
{
public string sampleString { get; set; }
public int sampleInt { get; set; }
}
class Program
{
SampleClass objSample;
public void SampleMethod()
{
for (int i = 0; i < 10; i++)
{ objSample = new SampleClass();
objSample.sampleInt = i;
objSample.sampleString = "string" + i;
ObjSampleHandler(objSample);
}
}
private void ObjSampleHandler(SampleClass objSample)
{
//Some Code here
}
}
在给定的示例代码中,每次调用SampleMethod()
时,它将迭代10次并为SampleClass
的实例分配新的内存空间并将分配给objSample
对象。
我想知道,
如果这是一个很糟糕的方法 记忆空间被浪费了吗?
如果是这样的话,有没有 更好的重用/优化方法 分配内存?
或者,我是否完全没有理由担心并进入不必要的微优化模式? :)
编辑:还要考虑在多线程环境中使用此类方法时的情况。这会改变什么吗?
答案 0 :(得分:4)
您正在做的技术术语是过早优化
考虑事物的性能影响,你肯定做得很好。但在这种情况下,.NET垃圾收集器将处理内存很好。 .NET非常擅长快速创建对象。
只要你的类的构造函数没有做很多复杂,耗时的事情,这不会是一个大问题。
答案 1 :(得分:3)
第二个选项。
除非遇到性能问题,否则不应该关注这种优化。
即使你是,它也取决于你在创建对象之后对对象所做的事情,例如,如果在ObjSampleHandler()中存储对象以便以后使用它们,你根本无法避免你的意思做的。
请记住,“早期优化是所有邪恶的根源”,所以他们说;)
答案 2 :(得分:1)
在创建新对象(objSample = new SampleClass();
)时,您不会重复使用该对象。您只是重用对SampleClass实例的引用。
但现在你强迫该引用成为类Program的成员变量,它可能是方法SampleMethod的局部变量。
答案 3 :(得分:0)
假设ObjSampleHandler
方法中的代码不会创建对objSample
的任何非本地引用,一旦方法完成,该对象将有资格进行垃圾收集,这将非常有效,并且不太可能引起关注。
但是,如果您因为这种类型的代码而特别遇到托管堆问题,那么您可以将类更改为struct
,它将存储在堆栈而不是更有效的堆上。请记住,虽然结构是按值而不是引用复制的,但您需要在代码的其余部分中理解这种结果。
public struct SampleClass
{
public string sampleString { get; set; }
public int sampleInt { get; set; }
}