Tag: value type

当用作函数的返回值时,C#结构是否曾被装箱?

一个简单的问题,但我还没有在Stack Overflow上找到明确的答案。 struct foo { int x; int y; int z; } foo Func() { return new foo(); } void Func2() { foo f = Func(); // did boxing and unboxing occur? } 从函数返回时,C#struct(值类型)是否总是复制到堆栈中,无论它有多大? 我不确定的原因是,对于除MSIL之外的某些指令集(例如x86),返回值通常需要适合处理器寄存器,并且不直接涉及堆栈。 如果是这样,那么调用站点是否为CLR堆栈预先分配了(预期)值返回类型的空间? [编辑:回复摘要:]对于原始问题的意图,答案是否定的; CLR永远不会(默默地)将结构化为仅仅为了将其作为返回值发送。

检查类型是否为blittable的最快方法?

在我的serialiser / deserialiser中,我有以下代码段: if (element_type.IsValueType && collection_type.IsArray) { try { GCHandle h = GCHandle.Alloc(array_object, GCHandleType.Pinned); int arrayDataSize = Marshal.SizeOf(element_type) * c.Count; var array_data = new byte[arrayDataSize]; Marshal.Copy(h.AddrOfPinnedObject(), array_data, 0, arrayDataSize); h.Free(); WriteByteArray(array_data); return; } catch (ArgumentException) { //if the value type is not blittable, then we need to serialise each array item one at a […]

值类型与参考类型的实例化和初始化

int number = new int(); 问题: 对于引用类型, new运算符通过在堆上分配内存来创建该类型的实例,然后通过调用类型的构造函数对其进行初始化。 如上所示,您可以对值类型执行相同操作。 对我来说,上面的行意味着调用构造函数int()以使用值初始化数字 。 我已经读过int是一个指向struct System.Int32的关键字。 因此,在Visual Studio中,我导航到结构Int32。 瞧,没有构造函数存在。 如果没有构造函数,这个预定义类型究竟是如何初始化为0的? 与上面相关,Int32结构中是否有一个存储值的字段? 对于自定义结构和类,我都可以使用new关键字创建新实例,而实际上不包含构造函数的结构或类。 在这种情况下,是否在struct / class包含的所有字段中都没有进行初始化? 唯一的事情就是在堆/堆上为值/引用类型分配内存? 最后,对于值类型,实例化和初始化不需要新的关键字。 这究竟是如何在较低级别上工作的? 假设我们做int number = 5; 。 它以某种方式转换为int a = new int(); a = 5; ? 如果是这样,怎么样? 太感谢了!

如何跟踪乱序的单个对象,然后连续加入()连续的对象?

我首先要说的是比一起盲目加入byte[]要困难一些。 我的主要目标是优化当前将许多512字节页面上传到Web服务器(Azure页面Blob)的应用程序,并将其减少为4Megs或更少的单个大型上载。 有关原因的更多背景信息,请参阅此问题底部的链接。 简要回答原因:通过使用Azure稀疏文件,此优化将提高速度(更少的IO)并节省长期资金 现在详细说明: 该课程需要 接受数据并存储它(数据定义为alignment start , alignment stop和随附的有效负载。 在N个数据到达或发生event , ProcessData() 。 这意味着是时候根据边界组装数据了( blob1的停止值必须与blob1对齐) 连续数据实际上可能无序到达。 非连续数据定义为在调用processData()之前调用应用程序未发送它时。 此外,如果整个512字节范围==零,那么它将获得特殊处理,并被视为非连续。 我们正在处理byte []的类型,因此这里有效的列表可能很复杂。 我想避免不必要的副本和数组的扩展。 合理? (像泥,我希望不是) 到目前为止我最接近的是编写方法签名:(我知道很蹩脚) // This can’t be bigger than 4Mb, or smaller than 512 byte[] BigBlobToUpload = new byte[]; /// /// Collects consecutive data ranges that will be uploaded /// /// The […]

为什么结构中的引用类型的行为类似于值类型?

我是C#编程的初学者。 我现在正在研究strings , structs , value types和reference types 。 作为此处和此处接受的答案, strings是引用类型,其指针存储在堆栈上,而它们的实际内容存储在堆上。 此外,如此处所声明的, structs是值类型。 现在我尝试使用一个小例子练习structs和strings : struct Person { public string name; } class Program { static void Main(string[] args) { Person person_1 = new Person(); person_1.name = “Person 1”; Person person_2 = person_1; person_2.name = “Person 2”; Console.WriteLine(person_1.name); Console.WriteLine(person_2.name); } } 上面的代码片段输出 Person 1 Person […]

可变的值类型包装器,传递给迭代器

我正在编写一个需要传递可变整数的迭代器。 public IEnumerable Foo(ref int valueThatMeansSomething) { // Stuff yield return …; } 这让我知道“错误476迭代器不能有ref或out参数”。 我需要的是在迭代器中修改这个整数值,并由迭代器的调用者使用。 换句话说,无论上面的调用Foo()想要知道valueThatMeansSomething和Foo()的结束值都可以使用它本身。 真的,我想要一个引用类型的整数,而不是值类型。 我唯一能想到的是写一个封装了我的整数的类,允许我修改它。 public class ValueWrapper where T : struct { public ValueWrapper(T item) { this.Item = item; } public T Item { get; set; } } 所以: ValueWrapper w = new ValueWrapper(0); foreach(T item in Foo(w)) { // Do […]

可与switch()一起使用的自定义结构/类型

我的一个项目有一个值类型/结构,表示video格式的自定义标识符字符串。 在这种情况下,它将包含一个内容类型字符串,但这可能会有所不同。 我已经使用了一个结构体,因此当它传递时它可以是强类型,并对初始字符串值执行一些健全性检查。 实际的字符串值可以是任何内容,由外部插件库提供,因此数字enum不适用。 public struct VideoFormat { private string contentType; public VideoFormat(string contentType) { this.contentType = contentType; } public string ContentType { get { return this.contentType; } } public override string ToString() { return this.contentType; } // various static methods for implicit conversion to/from strings, and comparisons } 由于存在一些非常常见的格式,我将这些格式暴露为具有默认值的静态只读字段。 public static readonly VideoFormat Unknown […]

是int吗? 值类型或引用类型?

这个问题更多的是关于添加? 一个值类型比关于int? 在C#中, int是值类型。 是int? 值类型或引用类型? 在我看来,它应该是一个引用类型,因为它可以为null 。

盒装价值类型比较

我在这里想要实现的是盒装基元类型的直接值比较。 ((object)12).Equals((object)12); // Type match will result in a value comparison, ((object)12).Equals((object)12d); // but a type mismatch will not. (false) object.Equals((object)12,(object)12d); // Same here. (false) 我理解’为什么’。 我只是没有看到’怎么样’。 这些类型在运行时之前是未知的,它们可以是来自数据源的任何基本类型。 这包括字符串,日期时间,bool等等。我已经走下了编写扩展方法的丑陋路线,该方法解决了两种类型,然后在进行’=​​=’比较之前进行转换:(为了完整性,我包括了每种基本类型,加上我感兴趣的那些) public static bool ValueEquals(this object thisObj, object compare) { if (thisObj is int) { int obj = (int)thisObj; if (compare is int) return (obj == (int)compare); […]

在C#中,值类型是可变的还是不可变的?

值类型行为表明,我们持有的任何值都无法通过其他变量进行更改。 但是我仍然对我在这篇文章的标题中提到的内容感到困惑。 任何人都可以澄清吗?