gpt4 book ai didi

java - 交换方法在 C# 中如何在内存级别工作?

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:25:21 26 4
gpt4 key购买 nike

我是一名 Java 程序员。我对 C# 知之甚少。但是来自 blogs我读过,Java 只支持按引用值传递,而在 C# 中默认是按引用值传递,但如果需要,程序员可以使用按引用传递。

我已经记下了我对交换功能如何工作的理解。我想弄清楚这个概念很重要,因为它是编程概念的基础。

C#:

public static void Main()
{
String ONE = "one"; //1
ChangeString(ONE); //2
Console.WriteLine(ONE); //3

String ONE = "ONE"; //4
ChangeString(ref ONE); //5
Console.WriteLine(ONE); //6
}

private static void ChangeString(String word)
{
word = "TWO";
}
private static void SeedCounter(ref String word)
{
word = "TWO";
}
  • 第 1 步:值为 one 的字符串对象在堆上创建并返回其位置的地址存储在变量 ONE 中. Runtime Environment 在堆上分配一 block 内存,并返回指向该内存块开头的指针。此变量 ONE存储在堆栈上,它是指向内存中实际对象的引用指针

  • 第 2 步:方法 changeString叫做。指针(或内存地址位置)的副本被分配给变量字。这个变量是方法的本地变量,这意味着当方法调用结束时,它会从堆栈帧中删除并且超出垃圾收集的范围。在方法调用中,变量 word 被重新分配以指向一个新位置,其中 TWO对象位于内存中。方法返回

  • 第 3 步:在控制台上打印应该打印出 ONE , 因为上一步改变的只是一个局部变量

  • 第 4 步:变量 1 被重新分配以指向对象 ONE 所在的内存位置居住。

  • 第 5 步:方法 changeString叫做。这次引用了ONE通过了。这意味着局部方法变量 word 是主作用域中变量 one 的别名。因此,没有复制引用。因此,将相同的变量传递给方法调用是等价的。该方法重新分配变量以指向恰好保存 TWO 的不同内存位置。 .该方法返回

  • 第 6 步:现在变量 one在外部范围内,即在 main 方法中被方法调用更改,因此它打印 TWO .

Java ,第 5 步是不可能的。那是你不能pass by reference .

请指正我上面描述的编程流程是否正确?


<支持>我看过的文章,herehere .

最佳答案

您似乎正确地理解了语义。只是为了用其他语言做一些类比..

在 C# 中,默认是对象引用(一个间接级别),值类型除外。引用传递本质上是传递指向对象引用的指针,这是双重间接。

最接近的是 C 或 C++ 类比。

C++

void ChangeString(std::string word)
{
word = "TWO";
}

void SeedCounter(std::string &word)
{
word = "TWO";
}

C(忽略const等问题)

void ChangeString(char * word)
{
word = strdup("TWO");
}

void SeedCounter(char ** word)
{
*word = strdup("TWO");
}

但 Java 类比可能必须是一个具有字符串成员的类:

public class StringRef
{
public string val;
}

public static void ChangeString(string word)
{
word = "TWO";
}

public static void SeedCounter(StringRef strRefWord)
{
strRefWord.val = "TWO";
}

根据要求详细说明。

在 C#(或更具体的 CLR)中,字符串变量是指针,但我们将其称为对象引用。该变量包含一个指向字符串对象的地址,通常位于堆中的某个位置。变量本身通常是一个类字段,它可能存在于堆中,或者是局部变量或参数,因此它存在于堆栈或局部变量槽中(也在堆栈中)。通过引用传递时,传递的是指向变量的指针,而不是指向最终对象的指针。您的“ref”参数是 A,A 指向 B,这是您的局部变量或对象字段,B 指向 C,内存中某处的字符串对象。通过 ref 传递传递了一个 A,它是指向 B 的指针,您现在可以更改 B。

关于java - 交换方法在 C# 中如何在内存级别工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25921371/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com