Tag: clr

为什么集合初始化程序与仅使用getter的属性一起工作?

这对我来说是非常不可预测的代码结果。 我没想到这段代码会产生这样的结果。 所以,我读了Jeffrey Richter的书(clr ia c#),这个代码有一个例子。 internal class ClassRoom { private List _students = new List(); public List Students { get { return _students; } } } ClassRoom classRoom = new ClassRoom { Students = {“Mike”, “Johny”, “Vlad”, “Stas”} }; foreach (var some in classRoom.Students) { Console.WriteLine(some); } 并且,正如你们中的一些人可以建议我们可以在控制台中看到四个名字。 所以,我的问题是: 我们如何得到我们的名字,如果他们要进入学生和分别在_学生中,因为学生不存在而没有被分配。 __________EDIT_1_______________ 我读了你的答案,谢谢你们。 但是,你知道,这是一种误解……我真的无法弄明白。 当我初始化学生时 […]

C# – 为什么class,new()约束使用Activator.CreateInstance ()?

我刚刚问过C# – new()约束的generics如何生成机器代码? 在思考了一段时间之后,我想知道为什么C#编译器会像这样发出IL。 为什么不能说一些IL喜欢:“调用T的默认构造函数”?

.net值类型初始化

内存中的值是什么,例如,声明后的整数值(int)但不是初始化? 在“CLR vi C#”中,Richter写道,该值类型初始化为0,但不允许使用。 那么在声明变量后会在内存中出现什么样的内容 int testVar; 如何实现初始化检查的机制?

使用CLR(和变体)将哪些CPU体系结构写入int“隐式易失性”?

我最近在这里学到以下是x86 CPU上的线程安全x86 CLR(不一定是ECMA标准CLR) public class SometimesThreadSafe { private int value; public int Value { get { return value; } } public void Update() { Interlocked.Add(ref value, 47); } } 这是因为在此类体系结构上写入int可确保同步任何其他CPU缓存。 但是在ARM CPU上,这不是线程安全的! 从另一个线程读取值可以读取CPU缓存中的旧副本。 所以问题在于CPU体系结构以及CLR的哪些版本及其变体(例如Mono)是否具有线程安全性?

用C ++编写事件并用C#处理它们

我有一台带有一些数字I / O引脚的工业计算机。 制造商提供了一些C ++库和示例来处理引脚状态更改。 我需要将这些事件集成到C#应用程序中。 AFAIK执行此操作的最简单方法是: 为从DIO引脚发出中断时触发事件的制造商库创建托管C ++ / CLI包装器。 引用包装并处理C#部分中的事件,因为它们是正常的C#事件。 我试图用一些没有运气的模拟对象来完成这项工作。 从文档中,函数EventHandler应该完成我案例中的大部分“脏工作”。 以下有关旧线程和MSDN文档中的EventHandler示例的信息,我最终得到了以下测试代码: C ++ / CLI using namespace System; public ref class ThresholdReachedEventArgs : public EventArgs { public: property int Threshold; property DateTime TimeReached; }; public ref class CppCounter { private: int threshold; int total; public: CppCounter() {}; CppCounter(int passedThreshold) { threshold […]

C# – new()约束的generics如何生成机器代码?

public T Foo(U thing) where T : new() { return new T(); } 当没有new()约束时,我理解它是如何工作的。 JIT编译器看到T,如果它是引用类型,则使用代码的对象版本,并专门针对每个值类型的情况。 如果你有一个新的T(),它是如何工作的? 它在哪里寻找?

是否可以在除C#之外的其他.NET语言中使用async-await?

async-await模式是.NET 4.5和C#5.0中更强大的补充之一 据我所知,它目前仅在C#和VB中可用。 此API是.NET CLR还是C#编译器本身的function? 我真正要问的是 – 我们是否应该期望在其他.NET语言中使用async / await,例如: C ++(通过C ++ / CLI) Python(通过IronPython) PHP(通过Phalanger) JavaScript(通过IronJS) 请注意我一般不会询问异步编程,而是关于async-await模式的细节(同步写入的异步代码)。

在C#中编译uint到int的时间转换

我在一段旧代码中得到了这样的枚举: [Flags] public enum Example: uint { Foo = 0x00000001, Bar = 0xC0000000 } 现在, FxCop正在抱怨这个enum使用uint而不是int作为它的支持字段。 (我的任务是尽可能将此代码作为FxCop清理……)但是现有的枚举值使用了枚举的高位,我无法改变它,因为它已经持久化磁盘格式。 当我尝试编译它时,C#编译器正确地抱怨: error CS0266: Cannot implicitly convert type ‘uint’ to ‘int’. An explicit conversion exists (are you missing a cast?) 所以,我打算将其更改为: [Flags] public enum Example { Foo = 0x00000001, Bar = (int)0xC0000000 } 但是,我并不认为我可以依赖于此而不是抛出算术exception,或者在读取或写入磁盘时没有正确处理。 我可以依赖这里的位格式匹配enum由unsigned int支持时使用的格式吗?

编译器版本与.NET Framework版本 – ASP.NET应用程序的场景

场景: 我的VS 2010(C#4编译器)在我的客户端计算机上以3.5为目标。 我正在开发ASP.NET应用程序。 我在类文件中使用可选参数(支持C#4)并编译代码,看起来一切正常。 稍后在运行时发现的一个问题,旧的(经典的我相信)ASPX正在使用该function。 没有函数只接受x参数,其中x比可选参数小1是运行时错误。 这是否意味着普通类,并且使用客户端的C#编译器,而视图(aspx)等使用服务器上的编译器 – 因此如果在视图/表单文件中使用C#4会导致问题?

在数组中自动实现接口

我读了一本书“通过C#第四版CLR”。 我无法理解一个陈述: 因此,例如,如果您有以下代码行: FileStream[] fsArray; 然后,当CLR创建FileStream[]类型时,它将使此类型自动实现IEnumerable , ICollection和IList接口。 此外, FileStream[]类型还将实现基类型的接口: IEnumerable , IEnumerable , ICollection , ICollection , IList和IList 。 我用这段代码测试了这个语句: FileStream[] fsArray = new FileStream[0]; string s = null; foreach (var m in fsArray.GetType().GetInterfaces()) s += m.ToString() + Environment.NewLine; 结果,我有这个: System.ICloneable System.Collections.IList System.Collections.ICollection System.Collections.IEnumerable System.Collections.IStructuralComparable System.Collections.IStructuralEquatable System.Collections.Generic.IList`1[System.IO.FileStream] System.Collections.Generic.ICollection`1[System.IO.FileStream] System.Collections.Generic.IEnumerable`1[System.IO.FileStream] System.Collections.Generic.IReadOnlyList`1[System.IO.FileStream] System.Collections.Generic.IReadOnlyCollection`1[System.IO.FileStream] IEnumerable和其他没有实现! 我在某处弄错了吗? 或杰弗里里希特犯了错误? […]