首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > C# >

像使用引用类型那样使用值类型,该如何处理

2012-04-22 
像使用引用类型那样使用值类型众所周知,C#不支持指针,然而很多人希望像使用引用类型那样使用值类型。更糟糕

像使用引用类型那样使用值类型
众所周知,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。

[解决办法]
很好的教程 楼主辛苦 学习了~!!!
[解决办法]
分析得不错
[解决办法]
探讨

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

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


我所说隐藏是说 ,比如是类对象 变量,其实就是一个指针,故传值 类对象,你修改对象的某些属性,其实你也就是修改原对象的属性。 还有传递引用等等.....
[解决办法]

探讨
我情愿这样写:

C# code

object[] x = new int[] { 1, 2, 3 }.Cast<object>().ToArray();

通过Linq来转换也很方便,最主要是这样做的好处是,我仅仅是对值类型进行了装箱操作,没有改变值类型本身的特性,而拆箱时基本没有性能损失。

热点排行