Jan 28

基准日期: 12/30/1899

Tags: ,
Jan 26

Generic是Framework 2.0的新元素,中文名字称之为“泛型” (我总是记不住这个名字 = =+)特征是一个带有尖括号的类,比如List<T>

在C#中,泛型用得最广泛的地方,就是集合(Collection)中。实际上,泛型的产生其中一个原因就是为了解决原来集合类中元素的装箱和拆箱问题(如果对装箱和拆箱概念不明,请百度搜索)。由于泛型的使用,使得集合内所有元素都属于同一类,这就把类型不同的隐患消灭在编译阶段——如果类型不对,则编译错误。

这里只讨论自定义泛型类。基本自定义如下:

C# 代码复制内容到剪贴板
  1. public class MyGeneric <T>   
  2. {   
  3.     private T member;   
  4.     public void Method (T obj)   
  5.     {   
  6.     }   
  7. }  

这里,定义了一个泛型类,其中的T作为一个类,可以在定义的类中使用。当然,要定义多个泛型类,也没有问题。

C# 代码复制内容到剪贴板
  1. public class MyGeneric <TKey, TValue>   
  2. {   
  3.      private TKey key;   
  4.      private TValue value;   
  5.   
  6.      public void Method (TKey k, TValue v)   
  7.      {   
  8.      }   
  9. }  

泛型的初始化:泛型是需要进行初始化的。使用T doc = default(T)以后,系统会自动为泛型进行初始化。

限制:如果我们知道,这个将要传入的范性类T,必定具有某些的属性,那么我们就可以在MyGeneric<T>中使用T的这些属性。这一点,是通过interface来实现的。

C# 代码复制内容到剪贴板
  1. // 先定义一个interface   
  2. public interface IDocument   
  3. {   
  4.    string Title ...{get;}   
  5.    string Content ...{get;}   
  6. }   
  7.   
  8. // 让范型类T实现这个interface   
  9. public class MyGeneric <T>   
  10. where T : IDocument   
  11. {   
  12.      public void Method(T v)   
  13.      {   
  14.           Console.WriteLine(v.Title);   
  15.      }   
  16. }   
  17.   
  18. // 传入的类也必须实现interface   
  19. public class Document : IDocument   
  20. {   
  21. ......   
  22. }   
  23.   
  24. // 使用这个泛型   
  25. MyGeneric<Document> doc = new MyGeneric<Document>();   

泛型方法:我们同样可以定义泛型的方法

C# 代码复制内容到剪贴板
  1. void Swap<T> (ref T x, ref T y)   
  2. {   
  3. T temp = x;   
  4. x = y;   
  5. y = temp;   
  6. }  

泛型代理(Generic Delegate):既然能够定义泛型方法,自然也可以定义泛型代理

C# 代码复制内容到剪贴板
  1. public delegate void delegateSample <T> (ref T x, ref T y)   
  2.   
  3. private void Swap (ref T x, ref T y)   
  4. {   
  5.     T temp = x;   
  6.     x = y;   
  7.     y = temp;   
  8. }   
  9.   
  10. // 调用   
  11. public void Run()   
  12. {   
  13.    int i,j;   
  14.    i = 3;   
  15.    j = 5;   
  16.    delegateSample<int> sample = new delegateSample<int> (Swap);   
  17.    sample(i, j);   
  18. }  

设置可空值类型:一般来说,值类型的变量是非空的。但是,Nullable<T>可以解决这个问题。

C# 代码复制内容到剪贴板
  1. Nullable<int> x;   // 这样就设置了一个可空的整数变量x   
  2. x = 4;   
  3. x += 3;   
  4. if (x.HasValue)   // 使用HasValue属性来检查x是否为空   
  5. {Console.WriteLine ("x="+x.ToString());   
  6. }   
  7. x = null;    // 可设空值  

使用ArraySegment<T>来获得数组的一部分。如果要使用一个数组的部分元素,直接使用ArraySegment来圈定不失为一个不错的办法。

C# 代码复制内容到剪贴板
  1. int[] arr = ...{1, 2, 3, 4, 5, 6, 7, 8, 9};   
  2. // 第一个参数是传递数组,第二个参数是起始段在数组内的偏移,第三个参数是要取连续多少个数   
  3. ArraySegment<int> segment = new ArraySegment<int>(arr, 2, 3);  // (array, offset, count)    
  4.   
  5. for (int i = segment.Offset; i<= segment.Offset + segment.Count; i++)   
  6. {   
  7.    Console.WriteLine(segment.Array[i]);    // 使用Array属性来访问传递的数组   
  8. }  

在例子中,通过将Offset属性和Count属性设置为不同的值,可以达到访问不同段的目的。

(转自: http://blog.csdn.net/ezhuyin/archive/2007/10/05/1812312.aspx)

 

Tags: , , , , ,
Jan 26

用VS2008做练习时,打开一个项目就退出,新建项目也有同样问题,重启后项目已经建立,但是就是打不开.

后来发现原来是金山词霸的屏幕取词的问题,关闭屏幕取词就没事了.晕

Jan 5

早听说过加拿大邮局(CANADA POST)臭名远扬,还好一直庆幸自己没怎么着过道.不过,常在河边走,哪能不湿鞋.这次,CANADA LOST终于大发神威了,被叫做CANADA LOST真是有道理的.

LP早在11月底在PLEASE MUM上趁便宜淘了些手套衣物什么的,PLEASE MUM发货不算慢,12月8日发了EMAIL告知了跟踪号,根据邮件,PLEASE MUM是在12月7日就从温哥华发了货,8日就到了屯子

2010/12/08 19:15 EDMONTON Item processed at postal facility

 

但是他们迟迟不给送货,我原以为是年底他们比较繁忙,所以在12月18日左右给CANADA POST打了电话,问他们为什么东西已经在POSTAL FACILITY但是不送货.他们回答说不知道,很抱歉,但是一定要发货人去问CANADAPOST才能得知东西到底在哪儿,收货人没办法查询.也不知这是什么破规矩.然后就快过年了,很忙....

一直到今天,LP终于去问PLEASE MUM了,他们联系的结果,当然,你肯定猜到了,包裹丢了,可以退款,但是那是LP淘到的便宜货啊,但是也没有办法,CANADA POST的人牛气冲天地说了句SORRY然后就挂了电话,LP原想再抱怨上几句也没门.可能他们也听得多了,再多的抱怨他们也刀枪不入.

可怜的加拿大人,可怜的CANADA LOST.

Jan 4

1. 先using System.Data.SqlClient;

2. 在函数中,定义SqlConnection:

C# Code Copy Code To Clipboard
  1. SqlConnection conn = new SqlConnection("...连接字串...");  

3. 紧接着,定义SqlCommand来执行SQL语句:

C# Code Copy Code To Clipboard
  1. string s = "select * from tableA";   
  2. SqlCommand q = new SqlCommand(s, conn);   
  3. conn.Open();  

4. 定义SqlDataReader来接受返回的记录,除了用ExecuteReader返回SqlDataReader,还有ExecuteNonQuery,ExecuteScalar返回简单值的应用,详见MSDN.用完以后,记得Close这个SqlDataReader,不然以后使用SqlCommand时会有麻烦.

C# Code Copy Code To Clipboard
  1. SqlDataReader r = q.ExecuteReader();   
  2. if (r.Read())   
  3. {   
  4.    Response.Write(r[0].ToString().Trim());   
  5. }   
  6. r.Close();  

 5.如果需要再次查询,可以使用同一个SqlCommand,只要记得前面关闭了SqlDataReader,使SqlCommand重获自由.

C# Code Copy Code To Clipboard
  1. q.CommandText = "update tableA set ColA='A' where ColB='B'";   
  2. q.ExecuteNonQuery();   

6. 全部用完以后,关闭SqlConnection

C# Code Copy Code To Clipboard
  1. conn.Close();  

 

 

 

 

Tags: , ,
分页: 17/33 第一页 上页 12 13 14 15 16 17 18 19 20 21 下页 最后页 [ 显示模式: 摘要 | 列表 ]