草庐IT

可变性

全部标签

c# - 为什么 Font 是不可变的?

字体不可变让程序员和GC都感到苦恼,因为您每次都需要创建一个新实例。为什么Font是不可变的引用类型? 最佳答案 它简化了渲染系统的使用。如果框架允许Font可变,则需要检测变化,并定期修改其呈现方式。由于Font创建了一个本地资源,保持这个不可变可以防止系统担心必须在内部重复地重新创建句柄。此外,我不同意“程序员的苦恼”。通过使Font不可变,它使用户创建Font对象时发生的事情更加明显。如果你想要一个新的Font,你需要创建一个新的Font对象,这又会创建新的原生字体资源。使Font不可变可以更清楚地了解正在发生的事情-您不太可

C# 可变数组项?

我需要一个包含可变项的数组,但找不到实现该操作的方法。privatevolatileT[]_arr;这意味着_arr引用是可变的,但是它不保证_arr对象本身内部的项目的任何内容。有什么方法可以将_arr的项目标记为易变的吗?谢谢。编辑:根据binarycoder的答案构建了以下代码。这段代码使用起来线程安全吗?publicclassVolatileArray{privateT[]_arr;publicVolatileArray(intlength){_arr=newT[length];}publicVolatileArray(T[]arr){_arr=arr;}publicTthis

c# - .NET JIT 编译器可变优化

https://msdn.microsoft.com/en-us/magazine/jj883956.aspxConsiderthepollinglooppattern:privatebool_flag=true;publicvoidRun(){//Set_flagtofalseonanotherthreadnewThread(()=>{_flag=false;}).Start();//Pollthe_flagfielduntilitissettofalsewhile(_flag);//Theloopmightneverterminate!}Inthiscase,the.NET4.5J

c# - 如何设计具有复杂初始化的不可变对象(immutable对象)

我正在学习DDD,并且遇到了“值对象”应该是不可变的声明。我知道这意味着对象状态在创建后不应更改。这对我来说是一种新的思维方式,但在很多情况下都是有道理的。好的,所以我开始创建不可变的值对象。我确保他们将整个状态作为构造函数的参数,我不添加属性setter,并确保不允许任何方法修改内容(仅返回新实例)。但现在我想创建这个包含8个不同数值的值对象。如果我创建一个具有8个数字参数的构造函数,我觉得它不会很容易使用,或者更确切地说-在传递数字时很容易出错。这不是好的设计。所以问题是:是否有任何其他方法可以使我的不可变对象(immutable对象)更好......,可以在C#中完成任何魔术来克

c# - 如何将 "zip"或 "rotate"列为可变数量的列表?

如果我有一个包含任意数量列表的列表,如下所示:varmyList=newList>(){newList(){"a","b","c","d"},newList(){"1","2","3","4"},newList(){"w","x","y","z"},//...etc...};...有没有办法以某种方式将列表“压缩”或“旋转”成这样的东西?{{"a","1","w",...},{"b","2","x",...},{"c","3","y",...},{"d","4","z",...}}显而易见的解决方案是做这样的事情:publicstaticIEnumerable>Rotate(thisI

c# - 字符串比较 == 是否仅因为字符串不可变才起作用?

我之前在比较两个字符串和它们的变量时有一个想法:stringstr1="foofoo";stringstrFoo="foo";stringstr2=strFoo+strFoo;//Eventhoughtstr1andstr2reference2different//objectsthefollowingassertionistrue.Debug.Assert(str1==str2);这是否纯粹是因为.NET运行时识别字符串的值是相同的并且因为字符串是不可变的使得str2的引用等于str1的引用?所以当我们执行str1==str2时,我们实际上比较引用而不是不是值?我原本以为这是语法糖的

c# - 您可以通过不安全的方法更改(不可变)字符串的内容吗?

我知道字符串是不可变的,对字符串的任何更改只会在内存中创建一个新字符串(并将旧字符串标记为空闲)。但是,我想知道我下面的逻辑是否合理,因为您实际上可以以循环方式修改字符串的内容。conststringbaseString="Thequickbrownfoxjumpsoverthelazydog!";//initializeanewstringstringcandidateString=newstring('\0',baseString.Length);//PinthestringGCHandlegcHandle=GCHandle.Alloc(candidateString,GCHand

c# - 如何编码可变大小的结构数组? C# 和 C++ 互操作帮助

我有以下C++结构structInnerStruct{intA;intB;};structOuterStruct{intnumberStructs;InnerStruct*innerStructs;};还有一个C++函数OuterStructgetStructs();我如何将其编码到C#?C#定义在哪里structOuterStruct{InnerStruct[]innerStructs;}; 最佳答案 您必须手动执行此操作,因为无法告诉P/Invoke层要从C++返回值中整理多少数据。structOuterStruct{intnu

c# - c#中可变长度字符串的固定长度数字哈希码

我需要存储从可变长度字符串生成的固定长度(最多8位)数字。散列不必是唯一的。它只需要在输入字符串更改时更改。.Net中是否有执行此操作的哈希函数?谢谢基肖尔。 最佳答案 我假设您这样做是因为您需要将值存储在别处并与它进行比较。因此,Zach的回答(虽然完全正确)可能会给您带来问题,因为String.GetHashCode()的契约(Contract)明确说明了其更改范围。因此这是一个固定的并且可以在其他语言中轻松重复的版本。我假设您会在编译时知道可用的小数位数。这是基于Jenkins一次一个哈希(由BretMulvey实现和exha

c# - C# 中的不可变和只读是什么意思?

不可更改不可变对象(immutable对象)的值是否正确?我有两个关于readonly的场景我想了解:如果我有一个集合并将其标记为readonly,会怎样,如下所示。我还能调用_items.Add吗?privatereadonlyICollection_items;还有以下变量,如果稍后我调用_metadata.Change,这将更改Metadata实例中一对成员变量的内部值._metadata仍然是不可变的吗?privatereadonlyMetadata_metadata;对于上面的两个变量,我完全理解我不能在初始化器和构造器之外直接给它们赋新值。 最佳