C# 只读字段是否允许在类外部修改?

2023-12-01

我有一个readonly我通过构造函数参数设置的对象字段。如果我修改对象,类内的字段也会改变,我猜这是通过引用调用。有什么办法可以更好地做到这一点/防止它吗?

private void Form1_Load(object sender, EventArgs e)
{
    Product p = new Product() { Name="New" };
    Store s = new Store(p);
    p.Name = "MODIFY!";
    MessageBox.Show(s.Show());//MODIFY!
}

public class Store
{
    private readonly Product product;

    public Store(Product product)
    {
        this.product = product;
    }

    public string Show()
    {
        return this.product.Name;
    }
}

public class Product
{
    public string Name { get; set; }
}

你存储在你的readonly字段是一个参考。当然,该引用是只读的并且从未改变。但其内容引用的对象仍然可以改变。

Since Product似乎是一个数据保存类,一种方法可能是将内容简单地复制到新实例中:

public class Store
{
    private readonly Product product;

    public Store(Product product)
    {
        // Create a new Product instance that only this Store instance
        // knows about
        this.product = new Product { Name = product.Name };
    }
}

现在的内容是Store.product只要您不导出此实例,就无法从外部更改。
但请注意该代码inside the Store类也许仍然可以改变内容。

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

C# 只读字段是否允许在类外部修改? 的相关文章

  • 如何在自定义保存操作 WFFM 中获取 Sitecore.Current.Site 对象?

    我在用着面向营销人员的 Sitecore 网络表单 在里面save action我得到的表格Sitecore Context Site对象 但该对象没有返回正确的上下文 该值为 modules shell 有谁知道我如何才能获得正确的上下文
  • 你好世界,裸机 Beagleboard

    我正在尝试在我的 Beagleboard xm rev 上运行 hello world 类型的程序 C 通过调用 Cputs功能来自装配 到目前为止 我一直使用这个作为参考 http wiki osdev org ARM Beagleboa
  • 递归显式模板实例化可能吗?

    给定一个类似的模板 template
  • 轮廓积分算法 C++

    我正在尝试编写一个应用数学程序来计算复平面中的轮廓积分 对于初学者来说 我想为梯形方法编写一个算法 但我有点坚持理解它会是什么样子 毕竟 我们通常将梯形方法视为 2D 图 而这里我们有 f C gt C 所以我们谈论的是 4D 最终我希望用
  • C# 从整数反序列化枚举

    是否可以从 C 中的 int 反序列化枚举 例如如果我有以下课程 class Employee public string Name get set public int EmployeeTypeID get set 我可以轻松地从 XML
  • 本机 C++ 通过代理 C++ 托管 dll 使用 C# dll

    这相当复杂 所以请耐心听我说 我有一个用本机 仅限 Win32 C 编码的第 3 方程序 目标 作为目标设计的一部分 它实现了一个 dll 插件系统 本机 DLL 当放置在程序的 ext 目录中时 由目标加载 然后 目标根据需要调用每个 D
  • 如何使用 Regsvr32 注册 .NET COM DLL?

    我有一个使用 COM DLL 的 VB6 应用程序 该DLL是用C 编写的 在 C 项目属性中 我检查了 Register for COM interop 选项 VB6 应用程序在我的开发机器上运行良好 C 代码完全遵循以下格式 CodeP
  • flowlayoutpanel和水平滚动条问题

    我正在使用一个 flowlayoutpanel 它有很多逻辑上的按钮 我遇到的问题是 当我调整窗口大小时 当窗口变小时 我无法看到所有水平排列的按钮 相反 当窗口变小时 按钮会下降到下一行 谁能帮我解决这个问题 我只是希望按钮水平排列 当窗
  • boost变体简单调用常用方法

    我有两个指针 只能设置其中之一 所以我正在考虑使用 boost variant 例如 boost variant
  • DLR 返回类型

    我需要 DLR 的帮助 我正在实现 IDynamicMetaObjectProvider 和 DynamicMetaObject 但在获取预期返回类型时遇到一些问题 我在元对象中覆盖 BindInvokeMember 我可以看到所有参数类型
  • 使用 openssl 库获取 x509 证书哈希

    我目前正在开发一个应用程序 它使用 openssl 库 libcrypto 来生成证书 现在我必须获取现有证书的哈希值 当我使用终端时 我可以使用以下命令生成哈希值 openssl x509 hash in cert pem noout 输
  • Parallel ForEach 的本地初始化如何工作?

    我不确定 Parallel ForEach 中本地 init 函数的使用 如 msdn 文章中所述 http msdn microsoft com en us library dd997393 aspx http msdn microsof
  • 等效

    这是否保证始终为真 std numeric limits
  • 在 4.x 内核上的 64 位内存中查找系统调用表

    我正在尝试编写一个简单的内核模块来查找 Linux 中的 sys call table 但遇到了一些麻烦 我在这里找到了 32 位 Linux 的基本指南 https memset wordpress com 2011 03 18 sysc
  • 为什么 istream/ostream 慢

    于 50 40http channel9 msdn com Events GoingNative 2013 Writing Quick Code in Cpp Quickly http channel9 msdn com Events Go
  • 如何设置扬声器声音增强设置

    如何以编程方式设置 Windows 扬声器设置 增强 选项卡 中可用的声音效果 恐怕这是不可能的 参见 Maurits 对他的评论blog http blogs msdn com b matthew van eerde archive 20
  • 绑定未正确更新用户控件属性 MVVM

    编辑 删除旧代码 我将它放在 MainWindow xaml 上
  • 警告从 lambda 返回捕获的引用

    我尝试使用 lambda 有条件地将引用绑定到两个变量之一 int foo bar int choice gt int if true some condition return foo else return bar 这会在 clang
  • 将整个单词与特殊字符匹配的正则表达式不起作用? [复制]

    这个问题在这里已经有答案了 我正在经历这个问题C Regex Match 整个单词 https stackoverflow com q 1209049 443568 它说要匹配整个单词使用 b模式 b 这对于匹配没有任何特殊字符的整个单词效
  • 将 Web 场迁移到 ASP.NET 运行时版本 4,同时保持会话

    我们已将 Web 应用程序从 net 运行时 2 v 3 5 迁移到 net 运行时 4 v 4 5 我有一个部署问题 我们的 sessionstate 服务器是一个 stateserver 并在单独的服务器上运行框架 2 中的 aspne

随机推荐

  • java.lang.IllegalStateException:尝试重新打开已经关闭的对象

    我试图弄清楚为什么我偶尔会收到 IllegalStateException 我找不到任何好的示例来展示如何使用线程加载列表来查询 SQLite 数据库 我在下面包含了我的代码 大多数时候它工作正常 但偶尔我会收到 IllegalStateE
  • 如何在 jQuery UI 自动完成中实现“mustMatch”和“selectFirst”?

    我最近从 制作的插件中迁移了一些自动完成插件贝斯斯坦斯 to the jQuery UI 自动完成 如何仅使用回调和其他选项来实现 mustMatch 和 selectFirst 而不修改核心自动完成代码本身 我想我解决了这两个功能 为了让
  • 用普通的 ascii 字符替换重音字符[重复]

    这个问题在这里已经有答案了 我需要将姓氏列表转换为字母数字用户名 但不幸的是其中一些包含非 ASCII 字符 Hern ndez Querman s Miguel ez 现在 一种方法是使用正则表达式删除任何非字母数字字符 例如a repl
  • 计算 R 中单词出现的次数

    是否有一个函数可以计算特定关键字在数据集中包含的次数 例如 如果dataset lt c corn cornmeal corn on the cob meal 计数将为 3 我们暂时假设您想要包含 corn 的元素的数量 length gr
  • 如何在 C# 中调用 Azure Rest API

    我是 C 世界的新手 我有一个项目 需要从 700 多个订阅中收集所有区域的 Azure 计算使用配额 我已经使用 PowerShell Get AzVMUsage 轻松完成了此操作 我必须使用 C 来完成 我想我需要使用 Rest API
  • Rmarkdown - Rmarkdown 中的 python 内联代码

    我正在将 Rmarkdown 与 python 一起使用 相当于什么Rpython 的内联代码 例如 在https rmarkdown rstudio com lesson 4 html我可以 r x 显示文本中 x 的值 但如果我这样做
  • EntityState.Deleted 不起作用,Remove(entity) 起作用吗?

    当我尝试读取记录 然后在同一事务中删除这些记录时 我一直在与 EF 作斗争 我最初使用 EntityState Deleted 方法 这会给出错误 操作失败 无法更改关系 因为一个或多个外键属性不可为空 当关系发生更改时 相关的外键属性将设
  • Java 8 Date API - 获取一个月中的总周数

    我有一个 Kotlin 函数来获取一个月中的总周数 Code fun getTotalWeeksInMonth instant Instant Int val calendar Calendar getInstance calendar t
  • 如何在 Visual Studio 中调试 Windows 服务?

    是否可以在 Visual Studio 中调试 Windows 服务 我用过类似的代码 System Diagnostics Debugger Break 但它给出了一些代码错误 例如 我收到两个事件错误 eventID 4096 VsJI
  • 为什么重新分配 Object.prototype 不起作用?

    为什么这不起作用 this one works as I expected when objSayHello Object prototype objSayHello function alert Hello from OBJECT pro
  • mysql 中的逗号分隔值和通配符

    我的数据库中有一个值 其中包含逗号分隔的数据 例如 11 223 343 123 我想获取数据 如果它与某个数字匹配 在本例中为数字 223 WHERE wp postmeta meta value IN 223 223 223 223 我
  • 如何从 qcombobox 获取 itemdata?

    当我单击 QtWidgets QPushButton 以显示 QtWidgets QComboBox 中的 itemData 时 出现问题 我用以下代码填充我的组合框 self comboBox addItem Sandro 1 self
  • 从适用于 Android 应用 API 17+ 的 CellSignalStrengthLte 获取 RSRP

    在过去的十年里 有一些人问过类似的问题 但没有人有任何答案 我需要编写一个 Android 应用程序来收集和存储 RSRP RSRQ CINR 和 Cell ID 答案需要在手机硬件允许的范围内尽可能准确 我正在三星 Galaxy S5 上
  • 如何创建只读 ng-repeat?

    初始渲染速度非常慢ng repeat 如何创建只读版本ng repeat 这样当您迭代的数组发生更改时 呈现的 HTML 不会更改 双冒号使 Angular 中的内容成为只读 使用以下语法 ul li item name li ul
  • 图像无拉伸或裁剪

    我的问题很简单 假设我有两个矩形图像 第一个宽 200 像素 高 100 像素 第二个宽 100 像素 高 200 像素 我想以恒定的宽度 高度显示图像 例如150 像素 x 150 像素 无需拉伸图像以适应 我不介意图像周围有空白 填充
  • 如何向 JScrollPane 添加多个元素

    因此 我试图向 JScrollPane 元素添加多个元素 但到目前为止我还无法将其拉出 我可以使第一个元素显示出来 在我的例子中是一张图片 但是在向 JScrollPane 添加额外的面板后 第一个元素消失了 甚至第二个元素 新面板 也没有
  • .Net Standard 上的 Log4Net 没有用于在没有存储库的情况下获取记录器的版本

    我正在尝试将一个项目转移到 net 标准 它基本上是一个类库 我正在使用 log4net 进行日志记录 并且我正在使用该方法 public static ILog GetLogger string name 由于这是一个被多个项目引用的库
  • Mysql 的 WHERE in 子句问题

    mysql 中的 where in 子句有什么问题 我的两张桌子SEATS and REGISTERS看起来像这样 SEATS REGISTERS seat id int register id int seat id varchar 10
  • 更改 Android 上另一个应用程序的权限(已 root)

    我看到了一些关于此的主题 但没有一个真正谈到我想做的事情 我正在尝试编写一个应用程序 该应用程序将拒绝另一个应用程序连接到互联网 IE 防火墙 的能力 根据我创建的算法 它将确定该应用程序是恶意的 该应用程序将安装在已root的手机上 然后
  • C# 只读字段是否允许在类外部修改?

    我有一个readonly我通过构造函数参数设置的对象字段 如果我修改对象 类内的字段也会改变 我猜这是通过引用调用 有什么办法可以更好地做到这一点 防止它吗 private void Form1 Load object sender Eve