Tag: 值类型

使用带有Delegate.CreateDelegate的值类型的C#

使用Jon Skeet的文章使reflection飞行和探索代表作为指导,我试图使用Delegate.CreateDelegate方法将属性复制为委托。 这是一个示例类: public class PropertyGetter { public int Prop1 {get;set;} public string Prop2 {get;set;} public object GetPropValue(string propertyName) { var property = GetType().GetProperty(propertyName).GetGetMethod(); propertyDelegate = (Func)Delegate.CreateDelegate(typeof(Func), this, property); return propertyDelegate(); } } 我遇到的问题是当我调用GetPropValue并传入”Prop1″作为参数时,我在调用Delegate.CreateDelegate时收到ArgumentException ,并显示消息”Cannot bind to the target method because its signature or security transparency is not compatible with that of the delegate type.” […]

结构和类对象数组的内存分配

最后一天我正在阅读C#参考,在那里我看到了一个声明。 请看下面的陈述。 语境: 对于Point使用结构而不是类可以在运行时执行的内存分配数量有很大差异。 下面的程序创建并初始化一个包含100个点的数组。 将Point实现为类,实例化101个单独的对象 – 一个用于数组,一个用于100个元素。 class Point { public int x, y; public Point(int x, int y) { this.x = x; this.y = y; } } class Test { static void Main() { Point[] points = new Point[100]; for (int i = 0; i < 100; i++) points[i] = new Point(i, i*i); […]

哪个更高效,将整个对象或该对象的属性传递给方法?

请考虑以下示例。 我需要检查CouponModel是否有唯一的串行密钥。 我有两个选择: CouponModel model = GetFromSomewhere(); if (!CouponHasUniqueKey(model)) { } //or if (!CouponHasUniqueKey(model.SerialKey)) { } 当然,在我传入整个对象的方法中,我必须访问字符串属性,而不是直接使用字符串。 哪个选项更好,为什么?

何时使用包含引用类型的值类型的数组而不是引用类型的数组?

假设我有以下内容: public class MyElement { } [Serializable] [StructLayout(LayoutKind.Sequential)] struct ArrayElement { internal MyElement Element; } public class MyClass { internal MyElement ComputeElement(int index) { // This method does a lengthy computation. // The actual return value is not so simple. return new MyElement(); } internal MyElement GetChild(ref MyElement element, int index) { if (element != […]

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

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

耗尽ValueType堆栈空间

我的理解是.Net中的每个新线程分配1MB的堆栈空间 。 进一步我的理解是值类型存储在堆栈而不是堆… 所以我的问题是这个; 这种行为是否意味着任何ValueType变量声明限制为1MB的存储空间? 你在当前范围内声明的ValueTypes越多,callstack就越有效,并且在某些时候这意味着声明(为了参数)〜260,000 int会使用你所有的堆栈空间?

Nullable 是“预定义的值类型” – 或者Equals()和==如何在这里工作?

对于我自己实现的Equals()方法,我想检查一堆内部字段。 我是这样做的: … _myNullableInt == obj._myNullableInt && _myString == obj._myString && … 我假设,这比较值,包括null,对于相等而不是对象地址(作为参考euqality比较操作会),因为: 对于此MSDN文档中的 “预定义值类型” ,可以这样说 。 我假设Nullable是这样的“预定义值类型”,因为它根据此MSDN文档位于System命名空间中。 我是否正确地假设VALUES在这里进行比较? 注意:unit testing显示“是”,但我希望其他人对这个问题感到放心,以防我错过了什么。

接口变量是否具有值类型或引用类型语义?

接口变量是否具有值类型或引用类型语义? 接口按类型实现,这些类型是值类型或引用类型。 显然, int和string实现IComparable , int是值类型, string是引用类型。 但是这个怎么样: IComparable x = 42; IComparable y = “Hello, World!”; (我试图回答的问题可能被删除了,因为它询问接口是存储在堆栈还是堆上,而且,正如我们都应该知道的那样,考虑到它们之间的值和引用类型之间的差异更具建设性。语义而不是它们的实现。有关讨论,请参阅Eric Lippert的堆栈是一个实现细节 。)

如何/为什么值类型可以从引用类型派生?

在.NET ,所有值类型都从名为System.ValueType的类inheritance。 System.ValueType是一个类,因此它是一个reference type 。 我的问题是value type如何以及为什么可能从reference type派生?

generics指针?

好吧所以我想创建一个将改变数据类型值的generics类。 我想这样做的原因是我可以使用undo和redo方法。 我可以为我需要的每种值类型编写一个类。 IE double,int …但如果我可以创建一个通用类来做这件事会容易得多。 这就是我所拥有的 class CommandChangeDouble : Command { double _previous; double _new; double* _objectRef; public unsafe CommandChangeDouble(double* o, double to) { _objectRef = o; _previous = *o; _new = to; *_objectRef = _new; } public unsafe void Undo() { *_objectRef = _previous; } public unsafe void Redo() { *_objectRef = _new; […]