当字符串和类都是引用类型时

2024-04-28

这是我上次面试的情况:

问题:字符串存储在哪里?

Answer:堆因为它是引用类型

问题:解释一下下面的代码:

static void Main(string[] args)
{
     string one = "test";
     string two = one;
     one = one + " string";

     Console.WriteLine("One is {0}" , one);
     Console.WriteLine("Two is {0}", two);
}

Answer:画了两张图如下:

(代表声明,string two = one;

(代表声明,one = one + " string";。在堆上创建并分配一个新字符串)

问题:正确的。绘制类似的代码片段如下:

class Program
{
    static void Main(string[] args)
    {
        Test one = new Test { someString = "test" };
        Test two = one;
        one.someString = "test String";

        Console.WriteLine("One is {0}", one.someString);
        Console.WriteLine("Two is {0}", two.someString);
    }
}

class Test
{
    public string someString { get; set; }
}

Answer:

[Test two = one] enter image description here

one.someString = "test String";

问题:好的。你都说了strings and classes是引用类型。那么为什么要为字符串创建一个新对象并为其赋值,而对于类,现有的字符串属性本身会被修改呢?

Answer:因为字符串是不可变的,而类是可变的。

(虽然我通过了面试,但我仍然不明白这种行为。为什么类的设计者在保持字符串不可变的同时使其可变?到处都有很多理论上的答案,但是任何人都可以通过解释这种特殊行为来使其变得简单吗用上面的代码?)


尽管字符串是引用类型,但它们被设为不可变的原因之一是使它们看起来和行为像原始类型(例如 int、double、float)。

这也是字符串是唯一可以表示为文字的引用类型的原因(例如,"some string")。许多其他语言也采用相同的方法,例如 Java。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

当字符串和类都是引用类型时 的相关文章

随机推荐

  • 检查 Django REST Framework 中相关对象的权限

    我定义了以下模型 class Flight models Model class FlightUpdate models Model flight models ForeignKey Flight related name updates
  • Delphi 有通用的“对象池”实现吗?

    我在寻找 Delphi 的数据库连接池实现时遇到了这个问题 对象池需要两个方法 get 从池中获取一个对象 如果池为空或者其大小尚未达到最大大小 这将创建一个新实例 此方法必须是线程安全的 以便两个线程不能同时获取一个对象同一时间 如果所有
  • Symfony2 - 访问被拒绝(用户未经过完全身份验证)

    我正在使用 Symfony2 开发一个网站 直到今天 登录没有问题 但现在登录时我没有正确验证 Symfony 分析器将我列为logged in as anon而不是我登录的用户 我还被重定向回登录页面而不是目标路径 登录过程由传统的登录表
  • cron 作业和 PHP (Zend Framework) 入门

    我对 cron 作业这个主题完全陌生 所以我不知道从哪里开始学习它们 何时 为何或如何将它们与我的 Zend Framework 应用程序或一般的 PHP 一起使用 任何人都可以通过示例解释该过程 或者推荐一些好的资源来入门吗 Cron 作
  • 笛卡尔散点图上的极坐标网格线

    我有一个脚本来创建散点图 使用gscatter 基于另一个脚本生成的 x y 数据 离散数据点 不连续 由于这些数据点实际上是圆形空间中某些对象的位置 因此添加极坐标网格线将使绘图更有意义 有谁知道如何在笛卡尔散点图上显示极坐标网格线 或者
  • GNU 链接器 - 孤立部分和符号分配

    在阅读了足够多有关 GNU 链接器的文档后 我对结合有关实现自定义链接器文件的两个不同概念感到困惑 第一个概念是孤儿节 https sourceware org binutils docs ld Orphan Sections html O
  • python asyncio 中的“Executing

    在设置 asyncio future 的结果时会打印下面的消息 Executing
  • 如何在我的类型类中访问我的服务(DependencyInjection)?

    我创建了一个服务 DependencyInjection 并在控制器上将其用作 this gt get service name gt someMethod 我想知道如何在我的表单类上使用它 这是我的课程示例形式 namespace Com
  • 如何为 Google Release 上的 Actions 提供不同的履行 URL?

    文档位于https developers google com actions deploy release environments https developers google com actions deploy release e
  • 如何向所有用户授予团队项目访问权限?

    在我们的组织中 我们有一些项目 根据政策 向所有有权访问 TFS 的开发人员 QA 和项目经理开放 在包含超过 150 个团队项目和 500 多个有效用户的团队项目集合中 我们如何轻松地将所有有效 TFS 用户添加到某个特定项目的 读者 组
  • 在文件之间共享变量(没有全局变量)

    据我了解 使用创建的变量let在 Javascript 中不能是全局的 我thought这意味着该变量仅存在于该特定文件中 然而 当我做一个简单 人为的例子时 A js let a 5 B js console log a 索引 html
  • 字符串到 CLLocation 纬度和经度

    我有两个表示纬度和经度的字符串 例如 56 6462520 我想将其分配给 CLLocation 对象以与我当前的位置进行比较 我尝试了以下代码 但只收到错误 CLLocation LocationAtual CLLocation allo
  • Objective-C 中“@public”是什么意思?

    读完一篇后关于 private 的问题 https stackoverflow com questions 844658 what does private mean in objective c我明白这是如何运作的 但是 由于所有变量都默
  • 操作系统如何知道缺失页面的磁盘地址?

    分页充当虚拟地址空间和物理地址空间之间的间接层 给定一个地址 操作系统 OS 内存管理单元 MMU 将其转换为主内存位置 我的问题是 主内存中不存在该页面的情况 操作系统如何知道在磁盘上哪里可以找到该页面 它在哪里存储1的信息 它不存储在页
  • 如何使用 ASP.NET 访问 Facebook 广告 API

    我希望访问使用适用于 NET 的 FaceBook 工具包的 FaceBook 广告 API 我在 codeplex com 中找到的 希望访问ads estimateTargetingStats尤其 Facebook 广告 API 详情
  • Html 5 音频标签自定义控件?

    我觉得我在这里服用了疯狂的药丸 因为我不知道如何使用自定义控件渲染 html 5 音频标签 到目前为止我有这个 html 它工作没有问题
  • 如何在 iPython 笔记本中保存单元格的输出

    我希望能够保存 iPython 笔记本的文本输出cell到磁盘上的文件中 我有 2 个额外的要求 要求 能够重新运行单元并用最新的内容覆盖我的输出 还显示笔记本内的输出 我已经弄清楚如何使用 capture将 iPython 笔记本的单元格
  • Swift Alamofire + Promise 捕获

    伙计们 除了catch之外 以下工作正常 xcode错误与expected member name following 这是使用 PromiseKit 进行承诺的正确方法吗 欢迎所有建议 谢谢 IBAction func loginButt
  • 使用 ProcessBuilder 运行 msys.bat

    我正在尝试使用 ProcessBuilder 在 java 中运行 msys bat 当我使用程序运行 bat 文件时 出现以下错误 找不到 rxvt exe 或 sh exe 二进制文件 正在中止 按任意键继续 这是代码 ProcessB
  • 当字符串和类都是引用类型时

    这是我上次面试的情况 问题 字符串存储在哪里 Answer 堆因为它是引用类型 问题 解释一下下面的代码 static void Main string args string one test string two one one one