Tag: 值类型

将不同值类型的数组转换为字节数组

这是我到目前为止所提出的,但它似乎不是最优的,任何关于更好方法的想法? public void ToBytes(object[] data, byte[] buffer) { byte[] obytes; int offset = 0; foreach (object obj in data) { if (obj is string) obytes = System.Text.Encoding.UTF8.GetBytes(((string)obj)); else if (obj is bool) obytes = BitConverter.GetBytes((bool)obj); else if (obj is char) obytes = BitConverter.GetBytes((char)obj); // And so on for each valuetype Buffer.BlockCopy(obytes, 0, buffer, offset, obytes.Length); […]

为什么固定大小的缓冲区(数组)必须是不安全的?

假设我想要一个7字节(或3或777)的值类型。 我可以这样定义: public struct Buffer71 { public byte b0; public byte b1; public byte b2; public byte b3; public byte b4; public byte b5; public byte b6; } 定义它的一种更简单的方法是使用固定缓冲区 public struct Buffer72 { public unsafe fixed byte bs[7]; } 当然第二个定义更简单。 问题在于必须为固定缓冲区提供unsafe关键字。 我知道这是使用指针实现的,因此不安全。 我的问题是为什么它必须是不安全的? 为什么C#不能提供任意常量长度数组并将它们保存为值类型而不是使其成为C#引用类型数组或不安全缓冲区?

Convert.ToBoolean以“0”值失败

我正在尝试将值”0″ ( System.String )转换为其Boolean表示forms,如: var myValue = Convert.ToBoolean(“0”); // throwing an exception here 我查看了MSDN页面 ,在代码示例块中,我找到了这些行: ConvertToBoolean(“0”); // … Unable to convert ‘0’ to a Boolean. 在我的代码中,我正在从System.String转换为Boolean如下所示: // will be OK, but ugly code var myValue = Convert.ToBoolean(Convert.ToInt32(“0”)); 有没有其他方法转换为Boolean类型没有这样丑陋的代码? 为什么会出现这种exception? 因为从引用类型System.String转换为值类型System.Boolean ,但System.Int32也是一个值类型,不是吗?

在检查null时,generics函数是否隐式地将值类型转换为对象?

例如,以下代码演示了我的思路: class Program { static void Main(string[] args) { int i = 0; IsNull(i); // Works fine string s = null; IsNull(s); // Blows up } static void IsNull(T obj) { if (obj == null) throw new NullReferenceException(); } } 还有以下代码: int i = 0; bool b = i == null; // Always false 是否存在隐式对象强制转换? […]

是否可以创建一个接受(可空)值类型和引用类型的C#generics方法?

我想创建一个接受值类型和引用类型参数的简单方法,即int是value,string是reference。 所以这就是我的开始: public bool areBothNotNull(T? p1, T? p2) { return (p1.HasValue && p2.HasValue); } 所以我希望能够像这样使用它: var r1 = areBothNotNull(3, 4); // will be true var r2 = areBothNotNull(3, null); // will be false var r3 = areBothNotNull(“three”, “four”); // will be true var r4 = areBothNotNull(null, “four”); // will be false 但我遇到的第一个问题是 类型’T’必须是不可为空的值类型,以便在generics类型或方法’System.Nullable’中将其用作参数’T’ 为了继续,我向我的方法添加一个struct约束 public […]

为什么结构中的迭代器可以修改它?

我发现允许在值类型中使用迭代器方法来修改this 。 但是,由于CLR的限制,调用方法没有看到修改。 ( this是通过值传递的) 因此,迭代器和非迭代器中的相同代码会产生不同的结果: static void Main() { Mutable m1 = new Mutable(); m1.MutateWrong().ToArray(); //Force the iterator to execute Console.WriteLine(“After MutateWrong(): ” + m1.Value); Console.WriteLine(); Mutable m2 = new Mutable(); m2.MutateRight(); Console.WriteLine(“After MutateRight(): ” + m2.Value); } struct Mutable { public int Value; public IEnumerable MutateWrong() { Value = 7; Console.WriteLine(“Inside MutateWrong(): ” […]

C#按值传递而不是按引用传递

考虑以下代码(我有意将 MyPoint编写为此示例的引用类型) public class MyPoint { public int x; public int y; } 它是普遍公认的(至少在C#中)当你通过引用传递时,该方法包含对被操作对象的引用,而当你通过值传递时,该方法复制被操纵的值,因此全局范围中的值是不受影响。 例: void Replace(T a, T b) { a = b; } int a = 1; int b = 2; Replace(a, b); // a and b remain unaffected in global scope since a and b are value types. 这是我的问题; MyPoint是一个引用类型,因此我希望Point上的相同操作在全局范围内替换a和b 。 例: […]

用于创建简单且高效的值类型的模式

动机: 在阅读Mark Seemann关于Code Smell:Automatic Property的博客时,他说接近结尾: 底线是自动属性很少适用。 实际上,只有当属性的类型是值类型并且允许所有可想到的值时,它们才适用。 他给int Temperature作为一个难闻的气味的例子,并建议最好的修复是单位特定值类型,如摄氏。 所以我决定尝试编写一个自定义的Celsius值类型,它封装了所有边界检查和类型转换逻辑,作为更加SOLID的练习。 基本要求: 不可能有无效的价值 封装转换操作 有效的应对(相当于替换它的int) 尽可能直观地使用(尝试int的语义) 执行: [System.Diagnostics.DebuggerDisplay(“{m_value}”)] public struct Celsius // : IComparable, IFormattable, etc… { private int m_value; public static readonly Celsius MinValue = new Celsius() { m_value = -273 }; // absolute zero public static readonly Celsius MaxValue = new Celsius() { m_value […]

为什么我不能写Nullable <Nullable >?

Nullable的定义是: [SerializableAttribute] public struct Nullable where T : struct, new() where T : struct意味着T只能是值类型的约束。 所以我很清楚我不能写: Nullable a; //error. makes sense to me 因为string是引用类型,而不是值类型。 但我真的不明白为什么我不能写 Nullable<Nullable> b; //error. but why? 为什么不允许? 毕竟, Nullable是一个值类型,因此,它可以是Nullablle类型参数。 当我在ideone上编译它时,它会出现此错误( ideone ): 错误CS0453:类型’int?’ 必须是非可空值类型才能在generics类型或方法’System.Nullable’中将其用作类型参数’T’编译失败:1个错误,0个警告

如何在C#中存储对整数的引用?

可能重复: 如何通过“引用”将其分配给c#中的类字段? 大家好 – 请告诉我如何使这项工作? 基本上,我需要一个整数引用类型(int *可以在C ++中工作) class Bar { private ref int m_ref; // This doesn’t exist public A(ref int val) { m_ref = val; } public void AddOne() { m_ref++; } } class Program { static void main() { int foo = 7; Bar b = new Bar(ref foo); b.AddOne(); Console.WriteLine(foo); // […]