Tag: value type

用例在C#中装箱值类型?

在某些情况下,需要将值类型的实例视为引用类型的实例。 对于这种情况,可以通过名为boxing的过程将值类型实例转换为引用类型实例。 当盒式化值类型实例时,将在堆上分配存储,并将实例的值复制到该空间中。 对此存储的引用放在堆栈上。 盒装值是一个对象,一个包含值类型实例内容的引用类型。 了解.NET的通用类型系统 在维基百科中有一个Java示例。 但是在C#中,有哪些情况需要打包一个值类型? 或者更好/类似的问题是,为什么人们想要在堆上(盒装)而不是堆栈上存储值类型?

是否可以更改基本数据类型的默认值?

我最近创建了一个通用的Matrix 类,它充当List <List >集合的包装器。 据我所知,这堂课工作得很好。 关于T的默认值,我遇到了一个小问题。 我创建了一个Matrix (3,3)的实例,它创建了一个3×3的整数矩阵,默认使用默认值(T)默认为0。 我知道值类型(包括基元)默认为0等效,引用类型默认为null。 我想知道是否可以更改此默认值,以便如果将值类型传递到Matrix,它将填充5,例如,而不是0。 我尝试创建自己的struct(值类型),但由于无法在结构体中使用无参数构造函数,我找不到从0更改默认值的方法。 我怀疑更改默认值是不可能的,并且我必须在实例化后逐个单元地循环遍历Matrix,但我想在这里询问以防万一。

使用闭包来跟踪变量:好主意或肮脏的技巧?

好吧,我需要能够跟踪作为另一个对象属性的值类型对象,如果没有这些属性实现IObservable接口或类似属性,则无法完成。 然后我想到了闭包和Jon Skeet的着名例子以及它如何打印出9次(或10次)而不是数字的升序。 所以我想为什么不这样做: Class MyClass { … Func variable; … public void DoSomethingThatGetsCalledOften() { MyValueType blah = variable(); //error checking too not shown for brevity //use it } … } … in some other consuming code … MyClass myClass = new MyClass(); myClass.variable = () => myOtherObject.MyOtherProperty; //then myClass will get the current value […]

将Structs与WCF服务一起使用

有没有关于使用结构作为WCF服务的返回类型的官方建议? 我目前正在与我没有写的服务进行互动,并发现自己受到启发,要求查看我的烦恼是否合理。 我过去总是使用类 – 可能部分是因为这是样本总是显示的,但正如我现在想的那样,出于其他“直观”的原因: 我通过定义一个单独的项目开始了契约风格,这个项目的接口代表了服务来回传递的类型。 我使用LINQ很多,因此对于可空性的测试是隐含的引用类型,而对于结构和其他值类型,我总是需要标记为可空。 虽然我承认它比我脑子里的项目符号列表更直观,但是有些东西会马上来找我。 我想问这个问题,因为我正在处理一个返回结构的服务,并且在处理返回值时必须写: var foo = Bar.Value.MyField; 代替 var foo = Bar.Value;

结构实现接口时会发生什么的详细信息

我最近遇到了这个Stackoverflow问题: 何时使用struct? 在其中,它有一个答案,说了一些有点深刻的东西: 另外,要意识到当一个struct实现一个接口时 – 就像Enumerator那样 – 并且被强制转换为该实现的类型,struct会成为一个引用类型并被移动到堆中。 在Dictionary类的内部,Enumerator仍然是一个值类型。 但是,只要方法调用GetEnumerator(),就会返回引用类型的IEnumerator。 这究竟是什么意思? 如果我有类似的东西 struct Foo : IFoo { public int Foobar; } class Bar { public IFoo Biz{get; set;} //assume this is Foo } … var b=new Bar(); var f=b.Biz; f.Foobar=123; //What would happen here b.Biz.Foobar=567; //would this overwrite the above, or would it have no […]

CLR顺序结构布局:对齐和大小

默认情况下,C#中的所有struct都被视为[StructLayout(LayoutKind.Sequential)]标记的值类型。 所以让我们采取一些struct并检查这个struct的大小: using System; using System.Reflection; using System.Linq; using System.Runtime.InteropServices; class Foo { struct E { } struct S0 { byte a; } struct S1 { byte a; byte b; } struct S2 { byte a; byte b; byte c; } struct S3 { byte a; int b; } struct S4 { int a; byte […]

Guid被认为是值类型还是引用类型?

Guids是使用new关键字创建的,这使我认为它是一种引用类型。 它是否正确? Guid uid = new Guid(); Guids是否存储在堆上?

值类型和引用类型之间的基本区别

可能重复: C#中的值类型和引用类型有什么区别? 值类型和重新引用类型之间的基本差异是什么

内存中.NET值类型的布局

我有以下.NET值类型: [StructLayout(LayoutKind.Sequential)] public struct Date { public UInt16 V; } [StructLayout(LayoutKind.Sequential)] public struct StringPair { public String A; public String B; public String C; public Date D; public double V; } 我有代码将指向值类型的指针传递给非托管代码,以及通过调用System.Runtime.InteropServices.Marshal.OffsetOf发现的偏移量。 非托管代码填充Date和double值。 为StringPair结构报告的偏移正是我所期望的:0,8,16,24,32 我在测试函数中有以下代码: FieldInfo[] fields = typeof(StringPair).GetFields(BindingFlags.Instance|BindingFlags.Public); for ( int i = 0; i > field {0} @ offset {1}”, fields[i].Name, offset)); } […]

在C#中使用带有`new`运算符的值类型的困境

当operator new()与引用类型一起使用时,实例的空间在堆上分配,引用变量本身放在堆栈上。 除此之外,在堆上分配的引用类型实例中的所有内容都将被清零。 例如,这是一个类: class Person { public int id; public string name; } 在以下代码中: class PersonDemo { static void Main() { Person p = new Person(); Console.WriteLine(“id: {0} name: {1}”, p.id, p.name); } } p变量在堆栈上,并且创建的Person实例(所有它的成员)都在堆上。 p.id为0 , p.name为null 。 这将是这种情况,因为堆上分配的所有内容都已清零。 现在我感到困惑的是,如果我使用带有new运算符的值类型。 例如,考虑以下结构: struct Date { public int year; public int month; public int day; […]