像使用引用类型那样使用值类型
众所周知,C#不支持指针,然而很多人希望像使用引用类型那样使用值类型。
更糟糕的是,很多人总是误解装箱拆箱,想破了脑袋也不得要领。
当然,C#并非绝对不支持指针,但是在性能不敏感的情况下,使用unsafe代码可能不是每个人都喜欢的。
除了像使用引用类型那样使用值类型,这段代码也可以用来解决协变不支持值类型的问题。
(这个问题是这样的,object[] x = new string[] { }; 合法,但是 object[] x = new int[] { }; 非法,因为int是值类型,虽然“看上去”int也是object的派生类)
为此,我分享一段代码,通过一个包装类来实现这样的需求。代码只是起到抛砖引玉的作用。
- C# code
using System;using System.Collections.Generic;using System.Linq;using System.Text;namespace ConsoleApplication1{ class Program { static void Main(string[] args) { Console.WriteLine("演示值类型引用:"); ValueTypeWarpper<int> i = 3; ValueTypeWarpper<int> j = 3; ValueTypeWarpper<int> refi = i; Console.WriteLine("i = {0}, j = {1}.", i, j); Console.WriteLine("i == j? {0}", i == j); refi.Value = 7; Console.WriteLine("i = {0}, j = {1}.", i, j); Console.WriteLine("i == j? {0}", i == j); Console.WriteLine("i > j? {0}", i > j); Console.WriteLine("演示值类型作为协变:"); object[] x = new ValueTypeWarpper<int>[] { 0, 1, 2, 3, 4, 5, 6 } .Where(y => y % 2 == 0).ToArray(); Console.WriteLine(string.Join(", ", x)); } } class ValueTypeWarpper<T> { public static implicit operator T(ValueTypeWarpper<T> x) { return x.Value; } public static implicit operator ValueTypeWarpper<T>(T x) { return new ValueTypeWarpper<T>() { Value = x }; } public T Value { get; set; } public override string ToString() { return Value.ToString(); } public override bool Equals(object obj) { return obj != null && obj.GetType() == this.GetType() && Value.Equals((obj as ValueTypeWarpper<T>).Value); } public static bool operator ==(ValueTypeWarpper<T> v1, ValueTypeWarpper<T> v2) { return v1.Equals(v2); } public static bool operator !=(ValueTypeWarpper<T> v1, ValueTypeWarpper<T> v2) { return !v1.Equals(v2); } public override int GetHashCode() { return Value.GetHashCode(); } }}
[解决办法]
嗯。
高级语言指针只过没隐藏而已,内部到处是指针。
[解决办法]
为什么不用 "int?"
================
int? 其实就是 Nullable<int>,这是一个结构体,还是ValueType。
[解决办法]
似乎和Nullable<T>的作用差不多~~~
[解决办法]
如果用class包装struct?
[解决办法]
[解决办法]
很好的教程 楼主辛苦 学习了~!!!
[解决办法]
分析得不错
[解决办法]
------解决方案--------------------
我所说隐藏是说 ,比如是类对象 变量,其实就是一个指针,故传值 类对象,你修改对象的某些属性,其实你也就是修改原对象的属性。 还有传递引用等等.....
[解决办法]