Tag: clr

试试赶上加快我的代码?

我写了一些代码来testingtry-catch的影响,但看到了一些令人惊讶的结果。 static void Main(string[] args) { Thread.CurrentThread.Priority = ThreadPriority.Highest; Process.GetCurrentProcess().PriorityClass = ProcessPriorityClass.RealTime; long start = 0, stop = 0, elapsed = 0; double avg = 0.0; long temp = Fibo(1); for (int i = 1; i < 100000000; i++) { start = Stopwatch.GetTimestamp(); temp = Fibo(100); stop = Stopwatch.GetTimestamp(); elapsed = stop – start; avg […]

为什么要检查这个!= null?

偶尔,我想花一些时间看.NET代码,看看事情是如何在幕后实现的。 我偶然发现了这个gem,同时通过Reflector查看String.Equals方法。 C# [ReliabilityContract(Consistency.WillNotCorruptState, Cer.MayFail)] public override bool Equals(object obj) { string strB = obj as string; if ((strB == null) && (this != null)) { return false; } return EqualsHelper(this, strB); } IL .method public hidebysig virtual instance bool Equals(object obj) cil managed { .custom instance void System.Runtime.ConstrainedExecution.ReliabilityContractAttribute::.ctor(valuetype System.Runtime.ConstrainedExecution.Consistency, valuetype System.Runtime.ConstrainedExecution.Cer) = { int32(3) […]

为什么C#不允许像C ++这样的非成员函数

C#将不允许编写非成员函数,每个方法都应该是类的一部分。 我认为这是所有CLI语言的限制。 但是我错了,我发现C ++ / CLI支持非成员函数。 编译时,编译器会使该方法成为某个未命名类的成员。 这是C ++ / CLI标准所说的, [注:非成员函数被CLI视为某些未命名类的成员; 但是,在C ++ / CLI源代码中,这样的函数不能用该类名显式限定。 尾注] 元数据中非成员函数的编码是未指定的。 [注意:这不会引起互操作问题,因为这些function不能公开显示。 尾注] 所以我的问题是为什么不C#实现这样的东西? 或者你认为不应该有非会员职能,每种方法都应该属于某一类? 我的意见是有非会员function支持,这有助于避免污染类的界面。 有什么想法吗..?

静态generics类作为字典

通用类中的静态字段对于每个通用参数组合都会有一个单独的值。 因此它可以用作Dictionary <Type, whatever > 这是比静态字典<types, 什么 >更好或更差? 换句话说,这些实现中的哪一个更高效? public static class MethodGen<TParam> { public static readonly Action<TParam> Method = CreateMethod(); static Action<TParam> CreateMethod() { /*…*/ } } 要么, public static class MethodGen { static readonly Dictionary<Type, Delegate> methods = new Dictionary<Type, Delegate>(); public static Action<T> GetMethod<T>() { //In production code, this would ReaderWriterLock Delegate […]

在C#中堆栈容量

有人能告诉我在C#中的堆栈容量是多less? 我正在尝试使用30,000个项目的数组形成一个三维网格closures的对象。

C#是'操作员的performance

我有一个需要快速性能的程序。 在其内部的一个循环中,我需要testing一个对象的types,看它是否从某个接口inheritance。 一种方法是使用CLR的内置types检查function。 最优雅的方法可能是“is”关键字: if (obj is ISpecialType) 另一种方法是给基类自己的虚拟GetType()函数返回一个预先定义的枚举值(在我的情况下,实际上,我只需要一个布尔)。 这种方法会很快,但不太优雅。 我听说有一个专门针对“is”关键字的IL指令,但这并不意味着在翻译成本地程序集时执行得更快。 任何人都可以分享一些洞察'是'与另一种方法的performance吗? 更新:感谢所有的知情答案! 似乎有一些有用的观点分布在答案中:Andrew关于'是'自动执行演员的观点是必不可less的,但Binary Worrier和Ian收集的演出数据也非常有用。 如果其中一个答案被编辑,包括所有这些信息,那将是非常好的。

解决MSB3247 – 在同一个相关程序集的不同版本之间发现冲突

在使用msbuild编译时,.NET 3.5解决scheme最终会出现此警告。 有时NDepend可能会帮忙,但在这种情况下,它没有提供任何进一步的细节。 像Bob一样,我不得不打开ILDASM中的每个程序集,直到find引用相关程序集旧版本的程序。 我曾尝试使用VS 2010 Beta 2中的MSBUILD(因为Connect文章指出这已在下一个版本的CLR中修复),但是并没有提供更多的细节(可能是Beta 2的固定版本) 有更好的(更自动的)方法吗?

在C ++ / CLI中,帽子angular色^做什么?

我正在阅读Ivor Horton的“开始Visual C ++ 2008”,其许多CLR示例都有这样的定义: int main(array<System::String ^> ^args) 我一页接一页地回到本书的开头,find第一个这样的例子,解释它的真正含义,但找不到一个例子。 显然,它意味着与标准int main(int argc, char *argv[]) ,但我想知道何时以及为什么^真正被使用,为什么它甚至存在(它是否做了指针*和引用&不能代表)?

为什么C#generics不能从C ++模板中的genericstypes参数中派生出来?

为什么C#generics不能从C ++模板中的genericstypes参数中派生出来? 我的意思是我知道这是不可能的,因为CLR不支持这个,但为什么? 我意识到C ++模板和C#generics之间的巨大差异 – 前者是编译时实体,必须在编译期间解决,而后者是一stream的运行时实体。 尽pipe如此,我仍然没有看到CLRdevise者为什么没有提出一个最终能够从一个genericstypes参数中派生出一个CLRgenericstypes的scheme。 毕竟,这将是非常有用的function,我个人非常想念它。 编辑: 我想知道一个核心问题,即解决这个问题,实现这个function的价格如此之高,以至于目前还没有落实。 例如,检查这个虚构的声明: class C<T> : T { } 正如Eric Lippert所注意到的,如果“ 如果T是一个结构怎么办?如果T是一个封闭的types,该怎么办?如果T是一个接口types,该怎么办?如果T是C,该怎么办?如果T是一个具有抽象方法的抽象types?如果T比C具有更less的可访问性?如果T是System.ValueType?(可以有一个从System.ValueTypeinheritance的非结构体吗?)System.Delegate, System.Enum,等等? “ 正如Eric继续说的那样,“ 那些简单而明显的 ”。 的确,他是对的。 我感兴趣的是一个既不容易也不明显的问题的具体例子,这个问题很难解决。

C#未经初始化的variables是否危险?

我熟悉C#规范, 第5.3节说,使用前必须分配一个variables。 在C和非托pipeC ++中,这是有意义的,因为堆栈不被清除,并且指针的内存位置可能在任何地方(导致很难追踪错误)。 但我的印象是运行时没有真正的“未分配”值。 特别是未初始化的引用types将始终有一个空值,永远不会从先前调用方法或随机值遗留下来的值。 这是正确的,还是我错误地认为这些年来检查null是足够的? 你可以在C#中使用trully unintializedvariables,或者CLR是否处理这个问题,总是有一些值被设置。