Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/email/3.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#方法通过值或引用返回int_C#_Memory_Stack_Heap Memory - Fatal编程技术网

C#方法通过值或引用返回int

C#方法通过值或引用返回int,c#,memory,stack,heap-memory,C#,Memory,Stack,Heap Memory,我正试图找出一个方法返回的int将存储在哪里。我假设它是堆栈,但我想澄清一下。情况如下: public int returnInt() { var returnVal=1: 返回值; } 在这种情况下,我知道returnVal将存储在堆栈上,并在returnInt方法运行时弹出。实际上,returnVal是一种值类型,因此不会通过引用传递 我不清楚的部分如下: public void callerMethod() { var intVal=returnInt(); } 我认为这里发生的是返回

我正试图找出一个方法返回的int将存储在哪里。我假设它是堆栈,但我想澄清一下。情况如下:

public int returnInt()
{
var returnVal=1:
返回值;
}
在这种情况下,我知道returnVal将存储在堆栈上,并在returnInt方法运行时弹出。实际上,returnVal是一种值类型,因此不会通过引用传递

我不清楚的部分如下:

public void callerMethod()
{
var intVal=returnInt();
}
我认为这里发生的是返回实际值,并将其保存在堆栈上的一个新内存位置,以供调用方法使用


有人能确认这是否正确吗?请随意更正我所说的任何不正确的内容。

调用方法()中的值是一个新值,与
returnInt()中的值无关。

我希望下面的例子能有所帮助

static int myStaticInt = 333;
public static int returnInt()
{
    return myStaticInt;
}

public static void callerMethod()
{
    var i = returnInt();
    i += 100;
    Console.WriteLine(i);
}

public async static Task Main(string[] args)
{
    Console.WriteLine(myStaticInt);
    callerMethod();
    Console.WriteLine(myStaticInt);
}
输出 结果
myStaticInt
仍然是
333


以下是以下内容的相关部分:

值类型变量直接包含其数据,而引用类型变量包含对其数据的引用。通过值将值类型变量传递给方法意味着将变量的副本传递给方法。方法内部对参数所做的任何更改都不会影响存储在参数变量中的原始数据

这里有一点关于C#规范部分的赋值

赋值给值类型的变量会创建被赋值的值的副本。这与分配给引用类型的变量不同,后者复制引用,但不复制引用标识的对象


通过引用传递和返回值类型 请注意,可以通过引用传递和返回值类型

请参阅和的“通过引用传递值类型”部分

有了这些知识,现在让我们修改示例并检查结果

static int myStaticInt = 333;
public static ref int returnInt()
{
    //var returnVal = 1;
    return ref myStaticInt;
}

public static void callerMethod()
{
    ref var i = ref returnInt();
    i += 100;
    Console.WriteLine(i);
}

public async static Task Main(string[] args)
{
    Console.WriteLine(myStaticInt);
    callerMethod();
    Console.WriteLine(myStaticInt);
}
输出 结果
myStaticInt
现在是
433
,而不是原来的
333

,返回类型存储在c#中,这几乎肯定是一个实现细节。@RobertHarvey你能展开吗?值类型按值赋值(因此得名)。如果有两个值类型相同的变量,并且将一个变量指定给另一个变量,则与右侧变量关联的值将复制到左侧变量。类似地,如果将函数的返回值(返回值类型)指定给变量,则会复制该值。当值类型的变量超出范围时,不需要清理。其他一切都是一个实现细节;一些你不需要考虑的问题。你的问题是重复的吗?您是在询问int是在堆栈上还是在堆上?或者你在问(你似乎暗示你相信方法存在于堆栈之上,而它们也不存在于堆栈之上)。或者,您是否在询问堆栈上为returnVal分配的内存位置是否被重新用于intVal?@Flydog57如果您将其作为答案写入,我将接受该答案
static int myStaticInt = 333;
public static ref int returnInt()
{
    //var returnVal = 1;
    return ref myStaticInt;
}

public static void callerMethod()
{
    ref var i = ref returnInt();
    i += 100;
    Console.WriteLine(i);
}

public async static Task Main(string[] args)
{
    Console.WriteLine(myStaticInt);
    callerMethod();
    Console.WriteLine(myStaticInt);
}
333
433
433