Tag: clr

奇怪的铸造行为。 无法将对象(int)强制转换为long

我有以下代码: int intNumber1 = 100; object intNumber2 = 100; bool areNumberOfTheSameType = intNumber1.GetType() == intNumber2.GetType(); // TRUE bool areEqual = intNumber1.Equals(intNumber2); // TRUE long longNumber1 = (long) intNumber1; // OK long longNumber2 = (long) intNumber2; // InvalidCastException. Why? 为什么第二次演员不工作? 我意识到这可能是因为对象没有明确的转换,但如果我们在运行时查看它的types,它是System.Int32 。 如果我使用var或dynamic而不是object ,它的工作原理。 有什么想法吗?

CLR和CLI – 有什么区别?

我是一个相当新的.NET框架,因此我想知道CLR和CLI之间的区别究竟是什么? 从我目前阅读的任何内容来看,似乎表明CLI是CLR的一个子集。 但是,CLR中的所有内容都不是强制性的吗? CLR创build一个CLI时可能会遗漏什么?

sizeof(int)在x64上?

当我在我的C#.NET项目中做sizeof(int) ,我得到的返回值是4.我把项目types设置为x64,那为什么说4而不是8呢? 这是因为我正在运行托pipe代码?

是铸造一样东西转换?

在Jesse Liberty的Learning C#书中,他说:“一种types的对象可以被转换成另一种types的对象,这就是所谓的”铸造“。 如果您调查下面的代码生成的IL,您可以清楚地看到,铸造的分配与转换后的分配没有相同的作用。 在前者,你可以看到拳击/拆箱的发生; 在后者中,您可以看到对转换方法的调用。 我最终知道它可能只是一个愚蠢的语义上的差异 – 但是转换只是换一个词。 我不是故意的,但是我对这个人的直觉并不感兴趣 – 意见不在这里! 任何人都可以指出一个明确的参考,确认或否认,如果铸造和转换是同一件事情? object x; int y; x = 4; y = ( int )x; y = Convert.ToInt32( x ); 谢谢 RP 注意在Matt关于显性/隐性的评论之后添加的: 我不认为隐含/显式是差别。 在我发布的代码中,这两种情况都是明确的。 隐式转换是将short指定给int时发生的。 请注意Sklivvz: 我希望得到证实,我怀疑Jesse Liberty(通常是清晰明了的)语言的松散是正确的。 我认为杰西·利伯蒂(Jesse Liberty)的语言有点松散。 我明白,铸造路由在对象层次结构 – 即,你不能从一个整数转换为一个string,但你可以从自定义exception派生从System.Exception转换为System.Exception。 不过有趣的是,当你试图从一个int转换为一个string时,编译器告诉你它不能“转换”这个值。 也许杰西比我想的更正确!

它是如何从一个枚举派生System.Enum是一个整数在同一时间?

编辑 :底部的评论。 另外, 这个 。 这是什么让我困惑。 我的理解是,如果我有这样的枚举… enum Animal { Dog, Cat } …我基本上做了什么是定义了一个值types称为Animal与两个定义值, Dog和Cat 。 这种types派生自引用types System.Enum (通常情况下,值types通常不会这样做 – 至less在C#中是不允许的,但在这种情况下允许这样做),并且具有用于来回转换int值的工具。 如果我刚刚描述的枚举types的方式是真实的,那么我期望下面的代码抛出一个InvalidCastException : public class Program { public static void Main(string[] args) { // Box it. object animal = Animal.Dog; // Unbox it. How are these both successful? int i = (int)animal; Enum e = […]

CLR是虚拟机吗?

我读过一本将.net CLR称为虚拟机的书吗? 任何人都可以certificate这一点? 我们在某些开发平台上需要虚拟机的概念是什么原因? 是不是可以开发一个完全面向对象且与.net一样强大的本地框架(一个没有虚拟机)? CLR作为虚拟机的书是“ Professional .Net Framework 2.0 ”。

.NET中类加载器的等价类

有谁知道是否有可能在.NET中定义“java自定义类加载器”的等价物? 给一点背景: 我正在开发一种以CLR为目标的新的编程语言,称为“自由”。 该语言的特点之一是它能够定义“types构造函数”,它是编译器在编译时执行的方法,并生成types作为输出。 它们是generics的泛化(语言确实具有普通的generics),并允许这样的代码被编写(使用“Liberty”语法): var t as tuple<i as int, j as int, k as int>; ti = 2; tj = 4; tk = 5; 其中“元组”的定义如下: public type tuple(params variables as VariableDeclaration[]) as TypeDeclaration { //… } 在这个特定的例子中,types构造函数tuple提供了类似于VB和C#中的匿名types的东西。 然而,与匿名types不同,“元组”具有名称,可以在公共方法签名中使用。 这意味着我需要一种types的方式,最终最终由编译器发出,可以跨多个程序集共享。 例如,我想要 在程序集A中定义的tuple<x as int>最终与程序集B中定义的tuple<x as int>相同。 这个问题当然就是Assembly A和Assembly B将会在不同的时间被编译,这意味着他们最终都会发布他们自己的元组types的不兼容版本。 我研究了使用某种“types擦除”来做到这一点,所以我会有一个像这样的一堆types的共享库(这是“Liberty”语法): class tuple<T> { public […]

.NET JIT编译的代码在哪里caching?

一个.NET程序首先被编译成MSIL代码。 当它被执行时,JIT编译器将把它编译成本地机器代码。 我想知道: 这些JIT编译的机器代码在哪里存储? 它只存储在进程的地址空间吗? 但是由于程序的第二次启动比第一次启动要快得多,我认为这个本地代码在执行完成之后一定已经存储在磁盘上了。 但是哪里?

.NET CLR是否真的为当前处理器优化?

当我读到像C#或Java这样的JITted语言的性能时,作者们通常会说理论上它们应该胜过许多本地编译的应用程序。 理论上说,本地应用程序通常只是针对处理器系列(如x86)进行编译,因此编译器无法进行某些优化,因为它们可能不会真正在所有处理器上进行优化。 另一方面,CLR可以在JIT过程中进行特定于处理器的优化。 有谁知道微软的(或者Mono的)CLR是否真的在JIT过程中执行特定于处理器的优化? 如果是这样,什么样的优化?

你有没有使用ngen.exe?

有没有人曾经使用ngen? 哪里? 为什么? 有没有任何性能改善? 何时何地使用它有意义?