C#9.0是2020年发布的,record特性还没用上的可以看过来,一起讨论下。
下面通过一个简单的示例演示record带来的好处。
1. 通过一个示例引出问题
public class Person
{
public string Name { get; set }
...
}
public class ClassA
{
public static List<Person> Items=new List<Person>{......};
public List<Person> GetList()
{
foreach(var item in Items)
{
item.Name=...
...
}
return Items;
}
}
如上代码,就是想把Items中的值修改下再返回,但是这样就会静态变量Items中的值也修改掉,导致下次再用它时数据发生变化了,这不是我们希望的。
至于为什么要修改Items中的值,实际情况可能是单位转换、翻译等等。
还有这里用静态变量,实际的情况可能是内存缓存(IMemoryCache)中取来的,我们并不想它原始值发生改变。
2. 传统解决办法
以前我们要解决这个问题,可能就是重新new新的对象,然后逐个属性和字段的赋值,这样写的问题是代码很啰嗦,不优雅。
还有个解决办法就是深拷贝一份,再来修改,这个问题可能就是性能不好了,内存和cpu都消耗的比较多。
可能还有其他的,欢迎讨论。
3. record特性解决
public record Person
{
public string Name { get; set }
...
}
public class ClassA
{
public static List<Person> Items=new List<Person>{......};
public List<Person> GetList()
{
var items = Items.ToList();
for(var i=0;i<items.Count;i++)
{
items[i]=items[i] with {Name=...}
}
return items;
}
}
解决代码如上,使用with表达式实现record的非破环性修改,需要注意的是Items是List泛型集合,是引用类型,需要ToList下以便接下来修改的不是原来的Items。
来源链接:https://www.cnblogs.com/pains/p/18783351
© 版权声明
本站所有资源来自于网络,仅供学习与参考,请勿用于商业用途,否则产生的一切后果将由您(转载者)自己承担!
如有侵犯您的版权,请及时联系3500663466#qq.com(#换@),我们将第一时间删除本站数据。
如有侵犯您的版权,请及时联系3500663466#qq.com(#换@),我们将第一时间删除本站数据。
THE END
暂无评论内容