[英]Memory allocation under Methods in C# .Net
我仍在学习 C# 并且我在理解方法中的内存分配方面遇到了困难。 让我们想象一下我得到了一些引用对象的情况,并且在我分配现有对象的方法中,将在内存中做什么?
我发现每个对象的实例方法是否在内存中重复? 但在我描述的情况下,对我来说并不是那么清楚。 任何其他参考将不胜感激。
public class ClassToBeAssigned : IClassToBeAssigned {}
public interface IClassToBeAssigned{}
public class AllocatingClass
{
private ClassToBeAssigned testAssigment;
// Just as example
void Main()
{
// new allocation in memory
testAssigment = new ClassToBeAssigned();
Assign(testAssigment);
}
// create here copy of context by assigned
void Assign(IClassToBeAssigned assigned)
{
// What will happend now if there are 4x method calls ?
DoSomething(assigned);
DoSomething(assigned);
DoSomething(assigned);
DoSomething(assigned);
}
void DoSomething(IClassToBeAssigned assignIt)
{
// What is happening here in memory allocation for that reference each call ?
IClassToBeAssigned dealWithIt = assignIt;
}
}
我只是对那里发生的事情有点困惑,我也找到了很多信息,但没有针对这个特定问题。
分配引用不会在 C# 中创建副本。 您只需在Main
创建一个新实例,因此只有一个ClassToBeAssigned
实例。
值类型除外; 这些需要特别照顾。 如果ClassToBeAssigned
是struct
而不是class
,则每次调用Assign(testAssignment);
实际上会创建一个新实例,它是testAssignment
的副本。 请注意,即使在这种情况下, DoSomething(assignment);
不会产生新的副本。 如果您想了解有关此主题的更多信息,请阅读 C# 中的拳击。
至于DoSomething
,它绝对什么都不做,所以不清楚你会在那里发生什么:)
DoSomething
会从堆栈中为dealWithIt
变量分配一些字节,因此根据系统,它会分配 32 位或 64 位,因为dealWithIt
只是一个引用。
来自assignIt
的引用将被复制到分配的内存中,然后立即再次释放,因为该方法已完成并且堆栈移回前一个方法。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.