Tag: 拳击

在C#中使用“类型”对象键入转换对象

到目前为止,这个对我来说有点棘手。 我想知道是否可以使用System.Type对象键入强制转换对象。 我在下面说明了我的意思: public interface IDataAdapter { object Transform(object input); Type GetOutputType(); } public class SomeRandomAdapter : IDataAdapter { public object Transform(object input) { string output; // Do some stuff to transform input to output… return output; } public Type GetOutputType() { return typeof(string); } } // Later when using the above methods I would […]

为什么((object)(int)1).Equals(((object)(ushort)1))产生错误?

我有一个情况,我有一个object ,我想检查与另一个object相等性。 public static bool Equals(object a, object b) { return a.Equals(b); } 当a = 1 (integer)且b = 1 (ushort (or basically not integer)) 。 我想知道这不应该是真的,但它确实会返回假… 编辑 更糟糕的是: Hashtable ht = new Hashtable(); ht.Add((int)1, “SOME STRING”); ht.Add((short)1, “SOME STRING”); ht.Add((long)1, “SOME STRING”); 我认为值’1’应该只允许一次。

无论类型如何,比较两个整数对象的相等性

我想知道如何比较两个盒装整数(可以是有符号或无符号)以保证相等。 例如,看看这个场景: // case #1 object int1 = (int)50505; object int2 = (int)50505; bool success12 = int1.Equals(int2); // this is true. (pass) // case #2 int int3 = (int)50505; ushort int4 = (ushort)50505; bool success34 = int3.Equals(int4); // this is also true. (pass) // case #3 object int5 = (int)50505; object int6 = (ushort)50505; bool […]

String.Format(…)中的Boxing和Unboxing ……以下是合理化的吗?

我正在做一些关于装箱/拆箱的阅读,事实certificate,如果你做一个普​​通的String.Format() ,你在object[]参数列表中有一个值类型,它将导致一个装箱操作。 例如,如果您正在尝试打印出整数的值并执行string.Format(“My value is {0}”,myVal) ,它会将myVal int粘贴到一个框中并在其上运行ToString函数。 浏览, 我发现了这篇文章 。 看来你可以简单地通过在值类型上执行.ToString ,然后将其交给string.Format函数: string.Format(“My value is {0}”,myVal.ToString())来避免拳击惩罚 这是真的吗? 我倾向于相信作者的证据。 如果这是真的,为什么编译器不能简单地为你做这个? 也许它自2006年以来发生了变化? 有人知道吗? (我没有时间/经验来进行整个IL分析)

好奇心:将C#结构转换为对象仍然会复制它

这个问题更多的是出于好奇而不是真正的问题。 请考虑以下代码(C#4.0,如果重要): class Program { static Point myPoint = new Point(3, 5); static void Main(string[] args) { Console.WriteLine(“Point Struct Before: ” + myPoint); object point = GetPoint(); Console.WriteLine(“Point Object Before: ” + point); myPoint.X = 10; Console.WriteLine(“Point Struct After: ” + myPoint); Console.WriteLine(“Point Object After: ” + point); } static object GetPoint() { return myPoint; […]

当作为具有接口约束的通用参数传递时,值类型是否装箱?

(作为回答这个问题的研究结果,我(我想我有!)确定答案是“不”。但是,我不得不在几个不同的地方找出来解决这个问题,所以我认为还有如果社区投票结束,我不会感到沮丧。) 例如: void f(T val) where T : IComparable { val.CompareTo(null); } void g() { f(4); } 4盒装? 我知道显式地将值类型转换为它实现触发装箱的接口: ((IComparable)4).CompareTo(null); // The Int32 “4” is boxed 我不知道的是,将值类型作为具有接口约束的generics参数传递是否等于执行强制转换 – 语言“其中T是IC可压缩”类型建议转换,但只是将T转换为IComparable似乎它会破坏通用的全部目的! 为了澄清,我想确保在上面的代码中没有发生这些事情: 当g调用f(4) , 4被IComparable为IComparable因为f的参数类型存在IComparable约束。 假设(1)没有发生,在f内, val.CompareTo(null)不会将val从Int32为IComparable以调用CompareTo 。 但我想了解一般情况; 不仅仅是int和IComparable发生了什么。 现在,如果我将以下代码放入LinqPad: void Main() { ((IComparable)4).CompareTo(null); f(4); } void f(T val) where T : IComparable { val.CompareTo(null); } […]

尝试从ExecuteScalar()获取值时抛出exception

在下面的代码中,语句1抛出了转换exception。 我想知道为什么不拆箱? 声明2工作正常,但我想知道为什么第一个是错的? using (IDbCommand command = connection.CreateCommand()) { command.CommandText = string.Format(“SELECT COUNT(1) FROM {0}”, tableName); int count = (int)command.ExecuteScalar(); //statement 1 } //int count = Convert.ToInt32(command.ExecuteScalar()); //statement 2

可变数量的参数没有装箱值类型?

public void DoSomething(params object[] args) { // … } 上述签名的问题在于,将传递给该方法的每个值类型都将被隐式装箱,这对我来说是严重的性能问题。 有没有办法去掉一个方法,接受可变数量的参数而不装箱值类型? 谢谢。

CLR如何知道盒装对象的类型?

当值类型被加框时,它被放置在无类型的引用对象中。 那么是什么导致了无效的强制转换exception? long l = 1; object obj = (object)l; double d = (double)obj;

所有C#强制转换都会导致装箱/取消装箱

我很想知道C#中的所有演员阵容是否会导致拳击,如果不是,所有演员阵容都是昂贵的操作? 从装箱和拆箱中取出的示例(C#编程指南) int i = 123; // The following line boxes i. object o = i; 这一行显然导致装箱(将int类型包装为一个对象)。 这是一项被认为代价高昂的操作,因为它会产生将要收集的垃圾。 那些来自2种不同类型的参考类型的演员表怎么样? 那是多少钱? 可以正确测量吗? (与前一个例子相比) 例如: public class A { } public class B : A { } var obj = new B(); var obj2 = (A)obj; // is this an “expensive” operation? this is not boxing