草庐IT

immutability

全部标签

c# - 为什么 System.Windows.Point 和 System.Windows.Vector 是可变的?

鉴于可变结构通常被认为是邪恶的(例如Whyaremutablestructs“evil”?),是否有潜在的好处可能促使.NET框架的设计者制作System.Windows.Point&System.Windows.Vector可变?我想了解这一点,以便我可以决定让我自己的类似结构可变(如果有的话)是否有意义。使Point和Vector可变的决定可能只是判断错误,但如果有充分的理由(例如,性能优势),我想了解它是什么。我知道我在Vector.Normalize()方法的实现上被绊倒了几次,因为令人惊讶的是(!),它没有返回一个新的Vector。它只是改变了电流矢量。我一直认为它应该是这样

c# - 如何使结构不可变?

在StackOverflow和互联网上,我发现保持结构不可变是一个很好的设计原则。不幸的是,我从未见过任何实际导致这些结构真正不可变的实现。假设一个结构内部没有任何引用类型,我该如何真正使结构不可变?也就是说,我如何防止其任何原始字段发生突变(可能通过编译时/运行时异常)?我写了一个简单的测试,试图使结构不可变,但即使使用System.ComponentModel.ImmutableObjectAttribute也不起作用:classProgram{staticvoidMain(string[]args){ImmutableStructimmStruct1=newImmutableSt

c# - .NET 枚举类型实际上是可变值类型吗?

仔细观察枚举类型的字段,我惊讶地发现保存枚举特定实例实际值的“支持”实例字段不是private,正如我所想的,但是public.它不是readonly任何一个。(IsPublic真,IsInitOnly假。)许多人认为.NET类型系统中的“可变”值类型是“邪恶的”,那么为什么枚举类型(例如从C#代码创建的)就是这样?现在,事实证明,C#编译器有某种魔法可以否认公共(public)实例字段的存在(但见下文),但在例如PowerShell你可以这样做:prompt>$d=[DayOfWeek]::Thursdayprompt>$dThursdayprompt>$d.value__=6pro

c# - 我如何确定一个类在 C# 中是否不可变?

如何确定C#中的类是否不可变? 最佳答案 有ImmutableObjectAttribute,但很少使用且支持不佳-当然也没有强制执行(您可以使用[ImmutableObject(true)]标记可变对象。据我所知,这唯一影响的是IDE处理属性的方式(即显示/不显示命名的属性选项)。实际上,您必须检查FieldInfo.IsInitOnly,但这仅适用于真正100%不可变的类型(假设没有反射滥用等);它无助于冰棒的不变性,也无助于在实践中不可变的事物,但在它们的实现中则无济于事;也就是说,它们不能公开可变,但理论上该对象支持它。这里

javascript - 如何使用 Immutable.js 从 javascript 原始对象创建记录映射?

我是immutable.js的新手,我想更好地了解如何使用从原始JS对象开始的记录。使用Immutable.fromJS()我可以创建一个传递原始对象的映射,例如:varimages={"1":{id:"1",urls:["/medium/1.jpg","/large/1.jpg"]},"2":{id:"2",urls:["/medium/1.jpg","/large/1.jpg"]}}varimagesMap=Immutable.fromJS(images);imagesMap现在是包含其他map的map,每个map对应一张map。我想创建一个包含记录的map,例如使用定义为Imag

javascript - 两个不可变列表——如何使三重相等起作用?

假设我们有一个使用Facebook的伟大Immutable.js创建的不可变对象(immutable对象).我想比较使用.map或.filter从单一来源生成的两个列表,并确保它们相等。在我看来,当您使用map/filter时,您正在创建一个与先前对象无关的新对象。如何使三重相等===起作用?这有什么意义吗?varlist=Immutable.List([1,2,3]);varlist1=list.map(function(item){returnitem;})varlist2=list.map(function(item){returnitem;})console.log("LIST

javascript - 从 Immutable.js 中的 Map 中的 List 中删除元素的最佳方法

我正在使用Facebook'sImmutable.js加速我的React应用程序以利用PureRendermixin.我的数据结构之一是Map()该map中的其中一个键有一个List()作为它的值(value)。我想知道的是,不知道要从List()中删除的项目的索引,删除它的最佳方法是什么?到目前为止,我已经想出了以下内容。这是最好(最有效)的方式吗?//this.graphsisaMap()whichcontainsaList()underthekey"metrics"onRemoveMetric:function(graphId,metricUUID){varindex=this.

javascript - 如何使用 flowtype 和 immutable.js 声明包含某些属性的 Map

给定一个这样创建的网站对象import{Map}from'immutable'constwebsite=newMap({name:'MyWebsite',url:'http://www.myw.fr'})我如何声明一个websiteType,它是一个完全包含给定属性的map。我知道我能做到:declaretypewebsiteType=Map但我想更具体一点,并声明一个映射,该映射必须包含string类型的属性name和url。有可能吗? 最佳答案 希望我答对了你的问题,因为我从未使用过“不可变”的map,因此我将使用es6Map.

javascript - 警告 : setState(. ..):无法在使用 redux/immutable 的现有状态转换期间更新

我遇到了错误Warning:setState(...):Cannotupdateduringanexistingstatetransition(suchaswithinrenderoranothercomponent'sconstructor).Rendermethodsshouldbeapurefunctionofpropsandstate;constructorside-effectsareananti-pattern,butcanbemovedtocomponentWillMount.我发现原因是constmapStateToProps=(state)=>{return{noti

javascript - 在 react 状态下替换数组中的对象

这个问题可能有点属于“最佳实践”问题,但请耐心等待。这是我的状态的一部分:this.state={typeElements:{headers:[{name:"h1",size:70,lineHeight:1.25,kearning:0,marginAfter:0},{name:"h2",size:70,lineHeight:1.25,kearning:0,marginAfter:0},{name:"h3",size:70,lineHeight:1.25,kearning:0,marginAfter:0}...我需要做的是替换header数组中给定索引处的对象。我不知道如何使用this.