RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题 / 709242
Accepted
Adrian
Adrian
Asked:2020-08-23 02:45:06 +0000 UTC2020-08-23 02:45:06 +0000 UTC 2020-08-23 02:45:06 +0000 UTC

关于引用数据类型的问题

  • 772

如果string是引用类型,比如 and class,那么为什么 ystr1和有str2不同的值呢?理论上,两个变量都应该引用堆上的同一个内存区域,country1以及country2

static void Main(string[] args)
{
    Country country1 = new Country();
    country1.x = 1;
    country1.y = 2;

    Console.WriteLine("Country1 {0}, {1}", country1.x, country1.y);

    Country country2 = new Country();
    country2 = country1;
    country1.x = 3;

    Console.WriteLine("Country1 {0}, {1}", country1.x, country1.y);
    Console.WriteLine("Country2 {0}, {1}", country2.x, country2.y);
    ///////////////////
    string str1;
    str1 = "123";

    Console.WriteLine("Str1 {0}", str1);

    string str2;
    str2 = str1;
    str1 = "1234";

    Console.WriteLine("Str1 {0}", str1);
    Console.WriteLine("Str2 {0}", str2);
}

在此处输入图像描述

c#
  • 3 3 个回答
  • 10 Views

3 个回答

  • Voted
  1. Best Answer
    Mirdin
    2020-08-23T03:36:20Z2020-08-23T03:36:20Z

    对于值类型的变量,值存储在变量本身中。对于引用类型的变量,该变量存储了对某个内存区域的引用,该区域又存储了一个值。现在关于 type string,这种类型的变量存储一个引用,但细微差别是这个引用指向的分配内存是不可变的,所以每次对字符串执行任何操作时,实际上都是在内存中创建一个新对象. 而这样的操作只会直接影响已经发生变化的变量。让我们看看你的例子。

    string str1; //здесь вы создали переменную str1, но она еще ни на что не ссылается
    str1 = "123"; //здесь в переменную str1 записывается адрес литерала "123"
    string str2;
    str2 = str1; //здесь мы записали в переменную str2, значение адреса литерала "123"
                 //который сохранен в переменной str1
    str1 = "1234"; //а вот сейчас мы пишем в str1 ссылку на совершенно другой литерал
                   //а в str2 остается старое значение, так с этой переменной 
                   //вы никаких манипуляций не проводили
    

    是的,一个小小的补充。如果你这样做:

    string str1 = "1234";
    string str2 = str1;
    string str3 = str1;
    

    所有三个变量都将引用相同的内存区域,但是任何更改都不会影响其他两个变量,而只会创建另一行。

    您可以阅读更多内容,例如:

    1. 字符串、不变性和持久性。
    2. 值类型和引用类型
    • 9
  2. Andrei S.
    2020-08-23T03:42:33Z2020-08-23T03:42:33Z

    看,String 确实是一个引用类型,但它的行为有点特定于 CLR,就像一个值类型。由于字符串传统上指的是“基本”类型,例如 int、double、Array,因此程序员下意识地期望字符串不是作为引用类型,而是作为值类型。为了确保这种行为,每次将新文字分配给字符串类型的变量都会创建一个新对象,并将对该新对象的引用返回给该变量。
    因此这条线

    var someString = "Value";
    

    可以理解为这样的伪代码

    var someString = new String(Char[]{'V','a','l','u','e'});
    

    更新
    如果值“Value”的字符串类型对象已经存在,CLR 将尝试不创建新对象,而是返回对现有对象的引用。总而言之,字符串是一种引用类型,它的值不是作为对象传递,而是作为对对象的引用。

    • 3
  3. Edgar Hovsepyan
    2020-02-15T15:44:10Z2020-02-15T15:44:10Z

    您好,我将尝试用更易于理解的语言进行解释。假设您创建了 4 个字符串变量,然后执行以下操作

    string s1 = "qwer";
    string s2 = "abcd";
    string s3 = s1;
    string s4 = s2;
    

    现在你有 s1 指向写入字符串 s3 的内存部分,还要注意 s3 不指向 s1 引用,即指向内存位置,也就是说,如果我们改变 s1 或 s3 的值,另一个值不会改变。还有 s2,s4。我认为这是合理且易于理解的解释,祝你好运。现在既然你知道这一切,试着在不写代码和编译的情况下思考和说出如果你这样做会发生什么

    s4 = s1;
    s1 = "1456";
    

    s1,s2,s3,s4 的值是多少?

    • -1

相关问题

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    Python 3.6 - 安装 MySQL (Windows)

    • 1 个回答
  • Marko Smith

    C++ 编写程序“计算单个岛屿”。填充一个二维数组 12x12 0 和 1

    • 2 个回答
  • Marko Smith

    返回指针的函数

    • 1 个回答
  • Marko Smith

    我使用 django 管理面板添加图像,但它没有显示

    • 1 个回答
  • Marko Smith

    这些条目是什么意思,它们的完整等效项是什么样的

    • 2 个回答
  • Marko Smith

    浏览器仍然缓存文件数据

    • 1 个回答
  • Marko Smith

    在 Excel VBA 中激活工作表的问题

    • 3 个回答
  • Marko Smith

    为什么内置类型中包含复数而小数不包含?

    • 2 个回答
  • Marko Smith

    获得唯一途径

    • 3 个回答
  • Marko Smith

    告诉我一个像幻灯片一样创建滚动的库

    • 1 个回答
  • Martin Hope
    Air 究竟是什么标识了网站访问者? 2020-11-03 15:49:20 +0000 UTC
  • Martin Hope
    Алексей Шиманский 如何以及通过什么方式来查找 Javascript 代码中的错误? 2020-08-03 00:21:37 +0000 UTC
  • Martin Hope
    Qwertiy 号码显示 9223372036854775807 2020-07-11 18:16:49 +0000 UTC
  • Martin Hope
    user216109 如何为黑客设下陷阱,或充分击退攻击? 2020-05-10 02:22:52 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    user207618 Codegolf——组合选择算法的实现 2020-10-23 18:46:29 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5