Tag: boxing

当用作函数的返回值时,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永远不会(默默地)将结构化为仅仅为了将其作为返回值发送。

为什么从short到int的转换失败?

我们有一些代码将数据从Microsoft Access数据库归档到MS SQL Server数据库。 假设我们已经从Access表填充了数据读取器,并且我们正在为SqlCommand添加一个参数以准备插入,我们有一个失败的类型转换。 这是代码: oSqlServerDbCmd_ForInsert.Parameters.AddWithValue(“@Duration”, (int) oReader[“Duration”]); oReader中的字段实际上是一个Access Integer,它是C#的简称。 如果我们在这里投短,那就没问题。 但是,如果我们转换为int,则代码会抛出InvalidCastException。 我可能会误解MSDN文档 : “存在从short到int,long,float,double或decimal的预定义隐式转换。” …但听起来这应该有用(我的理由是,如果定义了隐式转换,为什么显式类型转换不起作用?)。 我意识到转换甚至不是必需的,因为AddWithValue接受了一个对象,所以我们实际上已经从我们的代码中移除了转换,但是我希望看到为什么这个转换失败的解释,以防万一我们遇到这样的事情未来。

盒装价值类型比较

我在这里想要实现的是盒装基元类型的直接值比较。 ((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#中装箱值类型?

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

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

我最近遇到了这个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 […]

C#中的通用接口是否可以阻止拳击? (.NET vs Mono性能)

我有一个C#接口,其中某些方法参数声明为object类型。 但是,传递的实际类型可能因实现接口的类而异: public interface IMyInterface { void MyMethod(object arg); } public class MyClass1 : IMyInterface { public void MyMethod(object arg) { MyObject obj = (MyObject) arg; // do something with obj… } } public class MyClass2 : IMyInterface { public void MyMethod(object arg) { byte[] obj = (byte[]) arg; // do something with obj… } […]

为什么结构需要装箱?

在C#中,任何用户定义的struct都自动成为System.Struct System.ValueType和System.Struct的子类System.ValueType是System.Object的子类。 但是当我们为对象类型引用分配一些结构时,它会被装箱。 例如: struct A { public int i; } A a; object obj = a; // boxing takes place here 所以我的问题是:如果A是System.Object的后代,编译器是否不能将其上传到对象类型而不是装箱?

Nullable 的装箱/拆箱行为怎么可能?

我今天早些时候发生的事情让我摸不着头脑。 任何Nullable类型的变量都可以赋值为null 。 例如: int? i = null; 起初我无法看到如果不以某种方式定义从object到Nullable的隐式转换,这将是如何可能的: public static implicit operator Nullable(object box); 但是上面的运算符显然不存在,好像它确实如此,那么以下内容也必须是合法的,至少在编译时(它不是): int? i = new object(); 然后我意识到也许Nullable类型可以定义一个隐式转换到一些永远无法实例化的任意引用类型,如下所示: public abstract class DummyBox { private DummyBox() { } } public struct Nullable where T : struct { public static implicit operator Nullable(DummyBox box) { if (box == null) { return new Nullable(); […]