这个帖是补去年年底的.
买了房子以后,LD一直嫌原来的冰箱太小,当然,我也嫌.比起原来在MAGRATH的冰箱,现在这个小了很多.牛奶都放不下几桶.趁着年底BOXING DAY那阵,东跑西跑去选购冰箱.
那一天到SEARS,正看到一款KENMORE的冰箱在打折,1999打到1299,这算是不错的折扣了.里面还带有制冰机,容量也是32寸的极致了.看起来不错,买下之后一星期,货送到.原来的冰箱就移到地下室,继续做后备,家里做的咸肉香肠,屯的花种牛奶,都要有地方冷藏着不是.
新冰箱放好以后,还需要接跟水管到冰箱上,不然制冰机就是摆设.这点小事难不住我.去HD买了必要的一些材料,立马动工.
冰箱进水管用的是1/4英寸管,可以就近从某个水管接头引出,权衡之后,感觉从厨房水龙头入接比较合适.这房子厨房的厨柜分为2大块,互相不相连,水龙头在一块,冰箱在另一块,所以水管从水龙头处接出后,要走地下室顶部拖到冰箱后.这一下横跨整个厨房,买的一根20英尺长的1/4水管居然长度正好,真险呢.
下面来看看施工过程:
先确定水管从哪里引到冰箱,这个比较简单,在合适的地方用手枪钻打个洞就是,对于1/4的水管,用1/2的钻头在墙角打个洞:
布管,跑到地下室,仰头作业真累.一头从这个洞里伸出,夹个夹子让它不会掉落,另一头走最短的路线通到水龙头处.水龙头用的1/2寸水管原来就有个洞通到楼上,所以这一头不必再打洞了,只要让1/4管从原来1/2管洞处钻出就可以.
说着容易,做起来也很麻烦,因为原来1/2水管上楼时,不光通过一层楼板,还通过厨柜的下层隔板,这两屋板之间有不小的空隙,而且剩下的空间很有限,直接想从下面进入要通过这两屋隔板,我试了几次都不行.
再试另一个方法,从厨柜里向下探出一根铁丝通过这两层板相对比较容易,如下图:
通入地下室后,在地下室把铁丝固定在水管上:
再到楼上用力拉,终于,水管拉上来了
水管上来就好办了,在原来的厨房水龙头下方接水管处加入一个如下的三通,水从下入,龙头接上部,通冰箱的水管接到旁边.
接好后,在冰箱那头的水管上再装上一个阀门后再连入冰箱,打开各水阀试试各处接口没有漏水,再打开冰箱的冷水出口放水,各处都没有漏水,大功告成.
Generic是Framework 2.0的新元素,中文名字称之为“泛型” (我总是记不住这个名字 = =+)特征是一个带有尖括号的类,比如List<T>
在C#中,泛型用得最广泛的地方,就是集合(Collection)中。实际上,泛型的产生其中一个原因就是为了解决原来集合类中元素的装箱和拆箱问题(如果对装箱和拆箱概念不明,请百度搜索)。由于泛型的使用,使得集合内所有元素都属于同一类,这就把类型不同的隐患消灭在编译阶段——如果类型不对,则编译错误。
这里只讨论自定义泛型类。基本自定义如下:
- public class MyGeneric <T>
- {
- private T member;
- public void Method (T obj)
- {
- }
- }
这里,定义了一个泛型类,其中的T作为一个类,可以在定义的类中使用。当然,要定义多个泛型类,也没有问题。
- public class MyGeneric <TKey, TValue>
- {
- private TKey key;
- private TValue value;
- public void Method (TKey k, TValue v)
- {
- }
- }
泛型的初始化:泛型是需要进行初始化的。使用T doc = default(T)以后,系统会自动为泛型进行初始化。
限制:如果我们知道,这个将要传入的范性类T,必定具有某些的属性,那么我们就可以在MyGeneric<T>中使用T的这些属性。这一点,是通过interface来实现的。
- // 先定义一个interface
- public interface IDocument
- {
- string Title ...{get;}
- string Content ...{get;}
- }
- // 让范型类T实现这个interface
- public class MyGeneric <T>
- where T : IDocument
- {
- public void Method(T v)
- {
- Console.WriteLine(v.Title);
- }
- }
- // 传入的类也必须实现interface
- public class Document : IDocument
- {
- ......
- }
- // 使用这个泛型
- MyGeneric<Document> doc = new MyGeneric<Document>();
泛型方法:我们同样可以定义泛型的方法
- void Swap<T> (ref T x, ref T y)
- {
- T temp = x;
- x = y;
- y = temp;
- }
泛型代理(Generic Delegate):既然能够定义泛型方法,自然也可以定义泛型代理
- public delegate void delegateSample <T> (ref T x, ref T y)
- private void Swap (ref T x, ref T y)
- {
- T temp = x;
- x = y;
- y = temp;
- }
- // 调用
- public void Run()
- {
- int i,j;
- i = 3;
- j = 5;
- delegateSample<int> sample = new delegateSample<int> (Swap);
- sample(i, j);
- }
设置可空值类型:一般来说,值类型的变量是非空的。但是,Nullable<T>可以解决这个问题。
- Nullable<int> x; // 这样就设置了一个可空的整数变量x
- x = 4;
- x += 3;
- if (x.HasValue) // 使用HasValue属性来检查x是否为空
- {Console.WriteLine ("x="+x.ToString());
- }
- x = null; // 可设空值
使用ArraySegment<T>来获得数组的一部分。如果要使用一个数组的部分元素,直接使用ArraySegment来圈定不失为一个不错的办法。
- int[] arr = ...{1, 2, 3, 4, 5, 6, 7, 8, 9};
- // 第一个参数是传递数组,第二个参数是起始段在数组内的偏移,第三个参数是要取连续多少个数
- ArraySegment<int> segment = new ArraySegment<int>(arr, 2, 3); // (array, offset, count)
- for (int i = segment.Offset; i<= segment.Offset + segment.Count; i++)
- {
- Console.WriteLine(segment.Array[i]); // 使用Array属性来访问传递的数组
- }
在例子中,通过将Offset属性和Count属性设置为不同的值,可以达到访问不同段的目的。
(转自: http://blog.csdn.net/ezhuyin/archive/2007/10/05/1812312.aspx)



