日期:2014-05-18  浏览次数:20869 次

像使用引用类型那样使用值类型
众所周知,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?
------解决方案--------------------
探讨
为什么不用 "int?"


================

int? 其实就是 Nullable<int>,这是一个结构体,还是ValueType。

------解决方案--------------------
很好的教程 楼主辛苦 学习了~!!!
------解决方案--------------------
分析得不错
------解决方案--------------------
探讨

嗯。
高级语言指针只不过被隐藏而已,内部到处都是指针。

------解决方案--------------------