Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/image-processing/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 这些方法参数是存储在堆栈还是堆上?_C#_C# 4.0 - Fatal编程技术网

C# 这些方法参数是存储在堆栈还是堆上?

C# 这些方法参数是存储在堆栈还是堆上?,c#,c#-4.0,C#,C# 4.0,我读过无数文章,其中类和对象实例变量存储在堆上,而局部变量和方法变量通常存储在堆栈上 但是作为对象的方法参数呢 private void myMethod (int a, myObject b) { bool c = (a > 0 && b.myCounter < 0 ? true : false); //do some more work } //Are both a & b stored in the stack? Or is "a" in

我读过无数文章,其中类和对象实例变量存储在堆上,而局部变量和方法变量通常存储在堆栈上

但是作为对象的方法参数呢

private void myMethod (int a, myObject b)
{
   bool c = (a > 0 && b.myCounter < 0 ? true : false);
   //do some more work
}

//Are both a & b stored in the stack? Or is "a" in the stack and "b" on the heap?
private void myMethod(int a,myObject b)
{
boolc=(a>0&&b.myCounter<0?真:假);
//多做些工作
}
//a和b是否都存储在堆栈中?或者“a”在堆栈中,“b”在堆中?
编辑/更新:“b”当前是类,而不是结构。它具有大约20个属性,其中一些属性由布尔运算中包含的属性所决定(类似于代码示例中的“C”如何),因此,如果这更有意义的话,可以考虑将其重构为结构。p> 查看这些微观优化,因为这是一个实时和资源性能关键的金融应用程序

b是类的实例还是结构的实例

  • 如果它是一个类的实例,那么在堆栈中有一个对原始数据的引用,以及原始数据 数据存储在堆中
  • 如果它是一个结构的实例,它将存储在堆栈中

int a将作为值类型存储在堆栈上。我不知道myObject的类型是什么,它将用于确定它是存储在堆栈还是堆上。经验法则是所有引用类型都存储在堆上。。。包括根本不使用堆栈(也没有已知的实现这样做)…可能重复(至少值得一读,以避免“一般存储在堆栈上”的泛化,并对“局部和方法变量”使用适当的术语”-不知道这里的方法变量是什么意思)更进一步,您不应该担心.Net中的堆栈或堆,除非您确实需要这样做,即在极端时间关键型应用程序中进行微优化。这不仅可能会因实现而改变为版本,而且在使用时也可能会有非常细微的差别。投票关闭此对象的范围太广。假设
myObject
是一个类,则
b
引用的对象存储在堆中。但是,参数
a
b
的值都将存储在堆栈上。int是一种值类型,因此在调用函数之前,它的值将从调用站点复制到堆栈槽中。
b
参数是对引用类型实例的引用。在函数调用站点,对该对象的引用值也将在调用之前复制到堆栈插槽中option@AlexeiLevenkov在这种情况下,它要么是类的实例,要么是结构的装箱实例,那么对象总是在堆上吗?结构并不总是存储在堆栈上。我更新了这个问题。看看这是否会改变你的反应?谢谢:-)