Tag: clr

更改为通用接口的性能影响

我研究使用Visual Studio在C#/ .NET中开发的应用程序。 在我的方法的原型中,ReSharper经常建议我用更通用的参数替换输入参数的类型。 例如,List with IEnumerable 如果我只在我的方法体中使用带有foreach的列表。 我可以理解为什么它写起来更聪明,但我非常关心性能。 如果我听ReSharper的话,我担心我的应用程序的性能会降低… 当我写作时,有人能够(或多或少)向我解释幕后发生的事情(即在CLR中): public void myMethod(IEnumerable list) { foreach (string s in list) { Console.WriteLine(s); } } static void Main() { List list = new List(new string[] {“a”, “b”, “c”}); myMethod(list); } 和有什么区别: public void myMethod(List list) { foreach (string s in list) { Console.WriteLine(s); } } […]

C#中的静态方法与实例方法

对于我正在编写的应用程序,我希望具有极端的可扩展性,并且扩展方法似乎可以提供我想要的内容,以及在没有实例的情况下调用它们的能力,我也需要它。 我记得读过静态方法比实例方法更快但没有得到GC的优点。 它是否正确? 我不太可能改变我的设计,除非我找到一个更好的替代设计而不是速度。 但仍然需要额外的信息,我想知道速度,GC等的差异。 编辑:谢谢。 更多信息:假设我们有一个Person类: class Person 它可以有一个实例Distance方法,如: this.Distance (Person p) 这很好,但这并没有让我能够计算2点之间的距离(比如Point3),而不会创建Person类的实例。 我想要做的是: class Person (no Distance methods) 但是距离的扩展方法: Distance (this Person, Person) Distance (this Point3, Point3) 这样我可以这样做: myPerson.Distance (yourPerson) 和 Extensions.Distance (pointA, pointB) EDIT2:@Jon,是的,我认为这就是所谓的(没有得到GC的优点),但我不知何故认为静态方法会产生这种负担/开销。

.NET线程是否与操作系统线程不同?

.NET线程是轻量级用户模式线程还是内核模式操作系统线程? 另外,保留SQL Server,.NET线程和操作系统线程之间是否存在一对一的对应关系? 我也很感兴趣因为Thread类有一对名为EndThreadAffinity和EndThreadAffinity的对称方法,其文档巧妙地暗示.NET线程是真实操作系统线程上的轻量级抽象。 此外,我刚才读到一些堆栈溢出线程本身,微软试图在CLR中保持这种分离,就像SQL Server一样。 我记得有一些项目正在使用Fiber API来实现这个目的,但我不能说我理解了我所读到的所有细节。 我想要一些关于这个主题的更详细的文献,比如.NET线程的内部结构与Windows创建的线程的内部结构相比。 虽然有很多关于Windows创建的线程结构的信息,但Jeffrey Richter的高级Windows编程书是其中一个来源,例如,我找不到任何专门讨论.NET线程内部结构的文献。 有人可能会争辩说,这些信息可以在.NET源代码中找到,现在可以公开获得,或者使用反汇编程序,如Reflector或IL Spy,但是我没有看到任何代表线程控制块(TCB)和程序的信息。计数器(PC)和堆栈指针(SP)或线程的等待队列,或线程当前在Thread类中成员的队列列表。 我在哪里可以读到这个? 文档中是否提到了它的任何内容? 我已经从MSDN上阅读了所有这些页面,但他们似乎没有提到它。

C ++ / CLI MSIL程序集中的指针数组

我正在尝试包装一些遗留的C代码,以便与在.NET Core上运行的C#一起使用。 我正在使用这里给出的方法来创建一个编译为纯MSIL的C ++包装器。 它适用于简单的函数,但我发现如果我的代码使用指针指针或指针数组,它会因内存违规而崩溃。 通常它会崩溃Visual Studio,我必须重新启动所有内容,这很乏味。 例如,以下代码将导致崩溃: public ref class example { public: static void test() { Console::WriteLine(“\nTesting pointers.”); double a[5] = {5,6,7,8,9}; //Array. double *b = a; //Pointer to first element in array. Console::WriteLine(“\nTesting bare pointers.”); Console::WriteLine(a[0]); //Prints 5. Console::WriteLine(b[0]); //Prints 5. Console::WriteLine(“\nTesting pointer-to-pointer.”); double **c = &b; Console::WriteLine(c == &b); //Prints true. […]

为什么在.NET中放弃算术运算的接口?

在.NET中,不可能约束generics方法,因此它只接受数字类型,如下面的问题所述: 是否存在将我的generics方法限制为数字类型的约束? 。 但是如果你查看.NET的参考源( http://sourceof.net )并查看基本类型的源代码( Int32 , Int64 , Single等),就会引用一个叫做IArithmetic东西。具有所有原始类型的接口的实现 ,但实现已被注释掉。 无法找到接口的定义,但是查看实现的方法,接口定义了通用数字接口所需的方法。 所以我的问题是:为什么放弃这项工作?

什么是幕后的演员

可能重复: C#“as”演员与经典演员 我想知道当我做类似的事情时,.Net CLR的内幕会发生什么 对象myObj =“abc”; string myStr =(string)myObj; 以及第二行如何与string myStr = myObj.ToString()或string myStr = myObj as string; 环顾四周我找到了generics的答案,比如“编译器在那里插入代码”,但我并不满意……我正在寻找演员机制的深刻内容……哦,编译器插入代码? 给我看看! 编译器优化代码? 怎么样? 什么时候? 请尽可能接近金属!

Thread.sleep vs Monitor.Wait vs RegisteredWaitHandle?

(以下项目有不同的目标,但我很有趣,知道他们如何“PAUSEd”) 问题 Thread.sleep – 它是否会影响系统的性能?是否会将线程与其等待捆绑在一起? 那么Monitor.Wait呢? 他们“等待”的方式有什么不同? 他们在等待时会占用一个线程吗? 那么RegisteredWaitHandle呢? 此方法接受在发出等待句柄信号时执行的委托。 虽然它在等待, 但它并没有占用一个线程。 所以一些线程被暂停并且可以被代表唤醒,而其他线程只是等待? 旋转? 有人可以让事情更清楚吗? 编辑 http://www.albahari.com/threading/part2.aspx

如果新的c#6“?”null检查,则调用而不是callvirt

鉴于这两种方法: static void M1(Person p) { if (p != null) { var p1 = p.Name; } } static void M2(Person p) { var p1 = p?.Name; } 为什么M1 IL代码使用callvirt : IL_0007: brfalse.s IL_0012 IL_0009: nop IL_000a: ldarg.0 IL_000b: callvirt instance string ConsoleApplication4.Person::get_Name() 和M2 IL使用call : brtrue.s IL_0007 IL_0004: ldnull IL_0005: br.s IL_000d IL_0007: ldarg.0 IL_0008: […]

使用静态构造函数(Jon Skeet Brainteaser)

作为一个相对新手,我尽可能多地阅读关于特定主题的内容,并尽可能多地测试/编写代码。 我正在看Jons Brainteasers之一 (问题#2),我的输出与答案不同。 这使我在这里询问最近版本中是否有什么变化,并看看其他人从这段代码中获得了什么输出。 问题是,“将展示什么,为什么,你有多自信?” using System; class Foo { static Foo() { Console.WriteLine (“Foo”); } } class Bar { static int i = Init(); static int Init() { Console.WriteLine(“Bar”); return 0; } } class Test { static void Main() { Foo f = new Foo(); Bar b = new Bar(); } } 什么,如果有的话,会让我们得到两个不同的答案?

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

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