C# 字典值引用类型 - 请解释为什么会发生这种情况

2024-05-06

我不明白 C# 中以下 linqpad 查询的结果。评论应该解释我困惑的地方。

void Main()
{
    Dictionary<string, testClass> test = new Dictionary<string, testClass>();

    string key = "key";
    testClass val = null;

    test.Add(key, val);

    val = new testClass();

    test[key].Dump(); //returns null.   WHAT? I just set it!!!



    test[key] = val;
    val.Text = "something";
    //  returns val object, with Text set to "Something". 
    //  If the above didn't work, why does this work?
    test[key].Dump(); 



    val.Text = "Nothing";
    //  return val object, with Text set to "Nothing". 
    //  This, I expect, but, again, why didn't the first example work?
    test[key].Dump(); 



    val = null;
    //  returns val object, with Text set to "Nothing"...WHAT?? 
    //  Now my head is going to explode...
    test[key].Dump(); 

}

// Define other methods and classes here

public class testClass
{
    public override string ToString()
    {
        return Text;
    }

    public string Text { get; set;}     
}

主要原因是变量(val) 不是对象。它仅包含对对象(或 null)的引用。

testClass val = null声明一个类型的变量testClass并将其设置为空。它不指向任何对象。

test.Add(key, val)在字典中添加一个指向 null 的条目(注意:它doesn't指向val它也不指向任何对象)。

val = new testClass();创建一个new的实例testClass and val现在指向那个新对象。test[key] 仍然为空并且不指向任何对象。

test[key] = val;
val.Text = "something";
test[key].Dump(); 

这段代码点test[key]到同一个对象val指着。再次注意它不是指向val。当您更改对象时val.Text = "something"你可以使用看到变化test[key].Dump()因为它们都指向同一个对象。

val.Text = "Nothing";
test[key].Dump(); 

当你设置val.Text到字符串“Nothing”你可以看到变化test[key]出于与上述相同的原因,它们都指向同一个对象.

val = null;
test[key].Dump(); 

这段代码设置val指向 null。test[key] still指向物体。现在val and test[key]指向不同的事物。

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

C# 字典值引用类型 - 请解释为什么会发生这种情况 的相关文章

随机推荐

  • R 中的命名空间和泛型函数

    这个问题有点后续这个问题 https stackoverflow com questions 55361133 how to make your ranking values show integer without decimals in
  • Facebook python sdk使用营销api或图api

    我一直在使用facebook python SDK花了近 6 个月的时间来构建一个产品 我拥有营销 API 的开发访问权限 它经常错误地指出已超出速率限制 但是当我检查营销 API 仪表板时 它说没有足够的可用数据 所以我真的很困惑 SDK
  • 输入数据库时​​拆分文本框中的文本

    当插入 MS Access 数据库 时 如何将文本框中的单词拆分或放入另一行 例如 我的文本框有这些词 ABC DEF 生长激素指数 JKL 当用户按下回车按钮时 以下单词将被插入到文本框中 但每个单词都会在一个新行中 例如 ABC 将位于
  • 为什么 RestTemplate 不将响应表示绑定到 PagedResources?

    我正在使用 spring data rest 将实体公开为 分页 剩余资源 一切正常 但是当我通过以下方式请求数据时RestTemplate 我得到了一个无用的 HATEOAS JSON 我没有要求 JSON 似乎是一个 PagedReso
  • 聚合联系人会自动添加吗?

    您一定也在其他地方看到过这段代码 但显然这个异常没有答案 编辑 如果您来这里寻找通过 vcardio 恢复联系人的解决方案 这就是它 我在使用时得到了这个vCardIO http code google com p vcardio Andr
  • HTML 表格换行列

    我有一个表 用户将数据输入到列中 每次用户输入数据时都会创建一个新列 一段时间后 他们有大量的专栏 我需要它们换行 我知道如何将文本换行在列内 但我需要将整个列换行在第一列下方 依此类推 您不应该为此使用表格 您应该使用具有 float l
  • 是否可以将 WPF Combobox.SelectedValue 绑定到多个 ObjectDataProvider?

    尝试确定是否可以使用 XAMAL 绑定将 ComboBox 的 SelectedValue 绑定到多个 ObjectDataProvider 的输入 我查看了 MultiBinding 但这似乎将多个控件组合在一起 这并不完全是我今天想要的
  • 如何迭代嵌套的 stdClass? [复制]

    这个问题在这里已经有答案了 我有一个这样的对象 stdClass Object count gt 10 start gt 0 total gt 37 values gt Array 0 gt stdClass Object key gt 5
  • PHP:向网址添加参数?

    如果我有网址mysite com test php id 1 The id在页面加载时设置 可以是任何内容 那里还可能有其他人 例如 id 1 sort new 有没有办法只在末尾添加另一个而不先找出其他人是什么 然后构建新的网址 谢谢 作
  • 当必须同时使用 Git 和 Subversion 时如何处理 Git-svn

    Update 更详细地说 我尝试在家使用纯 Git 的原因是 我的公司希望迁移到 Git 但经理不愿意进行更改 因为开发人员不了解我们自己的存储库上的 Git 所以 我尝试做的是 我尝试让每个人都使用 Pure git 同时有人可以在这个学
  • 将解决方案升级到 .NET Framework 4.5 后,每日部署停止工作

    我们已经成功地使用 TFS2010 中的 msdeploy 每天更新我们的开发网站 在我们升级到 VS2012 我们的应用程序从 NET Framework 4 0 到 4 5 以及 ASP NET MVC 从 3 0 到 4 0 之前 这
  • 为什么受保护的 C++-Cli 析构函数不会导致编译错误?

    如果我编译并运行以下命令 using namespace System ref class C1 public C1 Console WriteLine L Creating C1 protected C1 Console WriteLin
  • Windows.Forms Visual Studio,如何直接在第一个窗口上打开第二个窗口?

    如何在第一个窗口的正上方打开第二个窗口 而不是在默认位置稍微对角地向右下或向后打开 我只是想制作一些可以点击的屏幕 我还应该这样做吗 为什么CenterParent不这样做呢 那么 CenterParent 会做什么呢 尝试将新表单的位置设
  • 制作 SQL Server 转储并将该转储导入另一个 SQL Server 的最佳(最简单)方法

    我想从一台服务器在 SQL Server 中实现数据库导出 转储 并将该转储导入到另一台 SQL Server 中 并且不一定使用相同的架构名称 例如 如果我准备了一个数据库 其中包含用于为新客户实施新数据库的所有数据集 则该数据库名为 D
  • 在 KRL 中如何获取当前的年、月、日?

    我正在开发一个应用程序 需要获取当前的年 月和日 有没有办法在规则的前块中获取此信息 我可以以字符串或数字或两者的形式获取此数据吗 目前有时间函数记录在http docs kynetx com docs Time http docs kyn
  • SSIS 脚本编辑器抛出异常

    我有 SQL Server 2012 SSIS SSDT 和 Visual Studio 2010 我可以创建一个新的 SSIS 包并添加脚本任务 但如果我尝试打开该脚本任务的脚本编辑器 则会收到以下错误 TITLE Microsoft V
  • 使用 simple_form 条目输入空数组值

    我对 Rails 和 simple form 仍然很陌生 并且一直在尝试实现多重选择选项来为用户提供多个角色 当前输入看起来像这样 所以 这确实有效 但在数组的开头包含一个空值 secondary
  • Android Studio 中的多个光标会自动出现在每个匹配的文本处吗?

    我一直在使用多个光标ALT SHIFT 有时我需要大约 20 个光标 并且希望它们位于文本同一部分的开头 每次都这样做很乏味 这有捷径吗 就像想象文件中有 20 个文本 foo 的实例 那么我只想选择一个 理想情况下它应该自动为同一位置的所
  • 我可以在反向传播期间(有选择地)反转 Theano 梯度吗?

    我热衷于利用最近论文中提出的架构 通过反向传播进行无监督域适应 http arxiv org pdf 1409 7495 pdf 在 Lasagne Theano 框架中 这篇论文的有点不同寻常之处在于它包含了一个 梯度反转层 invert
  • C# 字典值引用类型 - 请解释为什么会发生这种情况

    我不明白 C 中以下 linqpad 查询的结果 评论应该解释我困惑的地方 void Main Dictionary