当前位置: 首页 > wzjs >正文

如何制作收费网页seo工具大全

如何制作收费网页,seo工具大全,易旅游网站建设,网站开发技术构架Dictionary值拷贝还是引用 这可能算是Directionary的一个坑值类型(Value Type)引用类型(Reference Type)总结 关于锁1. **锁对象的可见性**2. **锁对象的唯一性**3. **最佳实践**4. **为什么 readonly 是一个好的选择**5. **总结*…

Dictionary值拷贝还是引用

  • 这可能算是Directionary的一个坑
      • 值类型(Value Type)
      • 引用类型(Reference Type)
      • 总结
  • 关于锁
      • 1. **锁对象的可见性**
      • 2. **锁对象的唯一性**
      • 3. **最佳实践**
      • 4. **为什么 `readonly` 是一个好的选择**
      • 5. **总结**
      • 示例代码

这可能算是Directionary的一个坑

我在调程序时发现一个奇怪的问题是,从Direction取到一个信息,修改值后,原对象的值并没有改变。
了解了一下才知道这个坑。
我说这是个坑的原因是,你不知道,那就真是个坑。因为一般而言,我们都认为容器就是容器。但这里显然不是这样。

所以这里需要记录一下,因为并不是所有的都是值拷贝。

在C#中,Dictionary<TKey, TValue> 的值类型(TValue)决定了取出元素的方式:

值类型(Value Type)

  • 如果 TValue 是值类型(如 intstruct 等),从字典中取出元素时会进行值拷贝。也就是说,你取出的是一个副本,对取出的副本进行修改不会影响字典中的原始值。
  • 例如:
    Dictionary<int, int> dict = new Dictionary<int, int>();
    dict[1] = 10;
    int value = dict[1]; // value 是 10 的副本
    value = 20; // 修改 value 不会影响字典中的值
    Console.WriteLine(dict[1]); // 输出 10
    

引用类型(Reference Type)

  • 如果 TValue 是引用类型(如 classstring 等),从字典中取出元素时取出的是引用。你可以通过这个引用直接修改对象的属性或状态,从而影响字典中的原始值。
  • 例如:
    public class CsvWaitingItem
    {public string Status { get; set; }
    }Dictionary<string, CsvWaitingItem> dict = new Dictionary<string, CsvWaitingItem>();
    dict["file1"] = new CsvWaitingItem { Status = "Pending" };CsvWaitingItem item = dict["file1"]; // 取出的是引用
    item.Status = "Completed"; // 直接修改对象的属性
    Console.WriteLine(dict["file1"].Status); // 输出 "Completed"
    

总结

  • 如果 TValue 是值类型,从字典中取出的是值的副本,无法直接修改字典中的原始值。
  • 如果 TValue 是引用类型,从字典中取出的是引用,可以通过引用直接修改字典中的原始值。

在你的代码中,csvWaitingItem 是一个类(引用类型),所以你可以通过引用直接修改字典中的值。

关于锁

看到代码中,直接将定义的一个 Dictionary 对象mydirectionobj锁了。
lock (mydirectionobj)
这代码让我觉得似乎是不对的。
了解了一下,确实这样不合理。
在多线程环境下,使用 lock 来保护共享资源是一种常见的做法。然而,直接将 Dictionary 对象本身作为锁对象并不是最佳实践,原因如下:

1. 锁对象的可见性

  • 当你将 Dictionary 对象本身作为锁对象时,其他代码可能会意外地修改这个对象,从而导致锁的行为不可预测。
  • 例如,如果其他代码不小心将 boardFileInfoDict 设置为 null 或者重新赋值,那么锁的行为就会变得不可控。

2. 锁对象的唯一性

  • 如果 Dictionary 对象被重新赋值,那么锁对象也会随之改变。这可能导致多个线程使用不同的锁对象,从而无法正确同步。
  • 例如:
    lock (boardFileInfoDict)
    {// 修改字典
    }boardFileInfoDict = new Dictionary<string, BoardFileInfo>();lock (boardFileInfoDict)
    {// 修改字典
    }
    
    在这种情况下,两个 lock 块实际上使用了不同的锁对象,无法保证线程安全。

3. 最佳实践

  • 为了避免这些问题,建议使用一个专门的锁对象,这个对象不会被其他代码意外修改。通常的做法是定义一个 readonly 的对象作为锁对象。
  • 例如:
    private static readonly object lockObject = new object();
    private static Dictionary<string, BoardFileInfo> boardFileInfoDict = new Dictionary<string, BoardFileInfo>();public static void SomeMethod()
    {lock (lockObject){// 修改 boardFileInfoDict}
    }
    

4. 为什么 readonly 是一个好的选择

  • 使用 readonly 修饰符可以确保锁对象在初始化后不会被修改,从而保证锁对象的唯一性和稳定性。
  • 这样可以避免其他代码意外地修改锁对象,导致锁的行为不可预测。

5. 总结

  • 直接将 Dictionary 对象本身作为锁对象是可以工作的,但并不是最佳实践。
  • 建议使用一个专门的锁对象(如 readonly object),这样可以避免潜在的线程安全问题,并且代码更加清晰和可靠。

示例代码

private static readonly object lockObject = new object();
private static Dictionary<string, BoardFileInfo> boardFileInfoDict = new Dictionary<string, BoardFileInfo>();public static void SomeMethod()
{lock (lockObject){// 修改 boardFileInfoDict}
}

这样可以确保多线程环境下的线程安全,同时避免潜在的锁对象被意外修改的问题。

抱歉将AI answer放在这里,但确实它写的格式很好。而且这些内容,对我算是新的知识。不像C++,c#,java这类所谓的语言,是某家公司或集团所定义的控制的,我们需要了解设计者的想法,才行。
如果是C++当然这些问题都是不存在的。

http://www.dtcms.com/wzjs/120344.html

相关文章:

  • 新国标小区网络建设重庆seo推广外包
  • 网站内页做友链自己怎么开发app软件
  • 用电脑做网站的历史在哪里找开源cms建站系统
  • 注册网站建设开发广州知名网络推广公司
  • 怎么做网站的后台维护seo营销是什么意思
  • 在线学做网站提升网页优化排名
  • 海洋做网站四川百度推广排名查询
  • 做网站建设挣钱吗营销传播
  • 网站建设方案批发网站排名优化+o+m
  • 中国空间站什么时候建成营销策划有限公司经营范围
  • 焦作音响网站建设怎么给自己的网站设置关键词
  • 转转怎么做钓鱼网站江北seo综合优化外包
  • 博客导航wordpress湘潭seo公司
  • seo和sem推广西安seo网络优化公司
  • 永州企业网站开发网站推广的要点
  • 网站建设方法牜金手指下拉覀全面的seo网站优化排名
  • 大连 网站建设徐州网络推广服务
  • 鄂州建设工程造价信息网seo关键词查询排名软件
  • 网站名称可以更换吗深圳谷歌seo公司
  • wordpress是动态网站吗网络营销推广渠道
  • 网站建设怎么做更好semicircle
  • 江苏省和住房城乡建设厅网站首页大连seo关键词排名
  • wordpress文章显示标题在首页山西seo和网络推广
  • 培训网站计时怎么破百度指数如何分析数据
  • 武汉自适应h5网站建设谷歌关键词热度查询
  • 如何更改wordpress语言郑州网站优化软件
  • 武汉建设网站企业北京seo优化多少钱
  • 中小企业的网站建设 论文今日国内新闻最新消息
  • 玩具网站 下载排名网
  • 用java做的网站有哪些内容sem优化软件选哪家