2011年6月24日

抽象类/实类继承接口后,是否必须全部实现接口的方法?(求高手解答)

以下是IList接口代码

// from module 'c:\windows\microsoft.net\framework\v1.1.4322\mscorlib.dll'
public interface System.Collections.IList :System.Collections.ICollection,
System.Collections.IEnumerable
{

// Properties
bool IsFixedSize { get; }
bool IsReadOnly { get; }
object this[ int index ] { get; set; }

// Methods
int Add(object value);
void Clear();
bool Contains(object value);
int IndexOf(object value);
void Insert(int index, object value);
void Remove(object value);
void RemoveAt(int index);
}
// end of System.Collections.IList

以下是CollectionBase抽象类接口代码

// from module 'c:\windows\microsoft.net\framework\v1.1.4322\mscorlib.dll'
public abstract class System.Collections.CollectionBase :
object,
System.Collections.IList,
System.Collections.ICollection,
System.Collections.IEnumerable
{

// Fields

// Constructors

// Properties
public int Count { virtual get; }

// Methods
public virtual void Clear();
public virtual bool Equals(object obj);
public virtual System.Collections.IEnumerator GetEnumerator();
public virtual int GetHashCode();
public Type GetType();
public virtual void RemoveAt(int index);
public virtual string ToString();
}
// end of System.Collections.CollectionBase

抽象类CollectionBase继承了接口IList,但并没有实现其全部方法。    int Add(object value);bool Contains(object value);int IndexOf(object value);void Insert(int index, object value);void Remove(object value);都没有被实现。

那么就说说抽象类继承接口后,可以不全部实现接口的方法。

但是接下来还是有疑问:

那我用WebFavoriteCollection类继承 CollectionBase ,但也没有全部实现以上的方法,我的WebFavoriteCollection类还是可以用的。但是如果我自己建立一个接口,实体类继承了之后就必须全部实现接口的成员,否则程序无法继续,那么我用抽象类继承接口,不全部实现接口成员,再用实体类继承抽象类,那么实体类就不用全部实现接口的成员了,是这么理解的吗?

我自己写测试代码试一下。

posted @ 2011-06-24 19:59 青草随缘 阅读(396) 评论(1) 编辑

2011年6月22日

VS.Net 的一些小技巧(转载)

使用Vs.Net 的一些小技巧
 

1、注释或重复代码片断
    
在我们写代码的往往要写代码注释,可是在每个类中写这些注释的文字是不是很烦,如果你每次用复制,粘贴的花是不是也是很麻烦,如果我们能想拖控件一样,拖到代码文件中多好啊,其实在在Vs中是可能的,我们只要把我们的代码块选中,然后在代码模式中向工具箱中把这个代码快直接拖到工具箱中就行了,接下来,我们在要注释的地方直接把这个“控件”拖到我们的代码中就行了,是不是很酷! 
             

 

2、格式化整个块

    我们在编写代码,或者从别人的Html源文件中粘贴一段Html代码粘到我们的Vs中的设计模式中的时候,是不是格式都是原模原样的,编写代码的时候,Vs可以很好的给我们用很整齐的格式排列好,方便阅读,可是粘到vs设计模式下的Html代码的就不能保证这么有格式了,以至于我们在查找某个标记是否关闭的时候,全部都是红色的波浪线,特别的头痛。现在有一个方便的方法,让vs为我们做这个排版的工作,我们可以从编辑高级下点击设计文档的格式,那么我们的代码或者Html就很整齐的排版好了。快捷键:Ctrl+K+D
                    
                                            (html混乱)
用Ctrl+K+D后
                 
         现在的Html标记是不是按着层次排好了!同样适用于cs代码
 

3、创建区域选择
   
VS.NET中通过按住Alt键,拖运鼠标在一个矩形区域上来做一个区域选择。不知道你是否这样选择过区域?这个技巧允许你创造一个区域并不包含其间的行(见图)。通过这个方法非常容易拷贝,剪切,粘贴矩形区域块。   
                         
                   

      你可能惊奇为什么有人需要这个深奥的特性。事实上,我经常使用它在上特定的文档段落中作一个目标查找-替换操作,但是由于常规的自动换行选项使得我没有办法这样作。我相信你会发现这个特性是非常方便的。

4、查找匹配的标记
     
某些标识总是成对出现。例如,“{”标识必须用对应的“}”标识关闭。虽然在Vs2005你点击一个{,和他匹配的}就会高亮显示,但是如果代码过长的话就不好找了,同样,编译器指示符“#region”必须有对应的“#endregion”指示符。当导航你的代码时,你有时需要查找对应的标识。通过按Ctrl-]你可以这样做。这个快捷键只有当光标在这些标识符的任何一个的下面时才起作用,它会立即跳转到对应的标识符而不管它是开的或闭的标识。
     
如果你想显亮两个匹配的标识之间的所有代码时,按Ctrl-Shift-]显亮整个块,并移动光标到开的标识处。这个快捷键只有当光标在任意的标识的下面时才起作用(如光标在区域内它就不会起作用了)。

5、跳转的方法的定义
    
当你看到你一个类的方法调用时,你极有可能想看看方法体。在VS.NET中通过上下文菜单实现。在文本编辑器中在方法名称内右击,从弹出菜单中选择到定义。VS.NET立即跳转到这个方法的定义处。这个特性的缺省的快捷键是F12。

6、实用预定义的代码片断
    
代码片断是流行的,预定义的文本模板,开发者能够选择,而不是手工敲入。例如,对Foreach循环,代替敲你需要的所有代码,你能简单地敲foreach。智能感知用新的代码片断图标显示Foreach项(见图)。如果你从智能感知列表中选择代码片项,接着按TabVS会插入对于“foreach”的预定义的代码片断。
                   

     由于园里的朋友不断的介绍自己在用Vs的一些技巧,所以这篇文章也在不断的更新,并且在这谢谢这些朋友们!
2007-10-30号更新

  7、设计视图和代码(cs)文件切换
     我们在添加一个.aspx文件的时候,要想切换到后台代码,可以在设计视图下,右击鼠标右键,有一个“查看代码”选项,我们就可以很容易的切换到后台代码中,我们也可以用快捷键F7,来相互切换。
  8、自定义的字符串大小写切换
     可能这个小标题命名的不太确切,这里的意思就是如果我们定义了一个想这样的字符串:

string strValue = "aaaaaaa";

   如果我们想让这个aaaaa变成大写的AAAAAA怎么办呢?删掉在重写?其实有个方便的变法就是用Ctrl+Shift+U,这个只能是小写转换成大写,如果我们把大写转换成小写的话就用Ctrl+U.
2007-10-31
   9、整行剪切,复制
     如果我们在对整行进行剪切,复制的时候,在不选中的情况下怎么复制或剪切呢?我们可以把鼠标移到这一行的前面,然后按下Ctrl+X,或者Ctrl+C,就可以对这整行进行复制,剪切了。(同样适用于粘贴)
      
期望以上的能给你带来写代码上的方便

posted @ 2011-06-22 10:19 青草随缘 阅读(21) 评论(0) 编辑

2011年6月4日

使用微软的 Visual Studio International Pack 1.0 进行网站简体与繁体的互转和得到汉字、拼音、笔画等相关信息(引用并修改【孟子E章】/誓言的爱 的文章)

2009年3月31日,微软发布了 Microsoft Visual Studio International Pack 1.0 SR1。Visual Studio International Pack 包含一组类库,该类库扩展了.NET Framework对全球化软件开发的支持。使用该类库提供的类,.NET 开发人员可以更方便的创建支持多文化多语言的软件应用。下载地址是:http://www.microsoft.com/downloads/details.aspx?FamilyID=44cac7f0-633b-477d-aed2-99aee642fc10&DisplayLang=zh-cn  该软件包1.0版提供下面七个组件以增强.NET Framework对全球化软件应用开发的支持。

  1. East Asia Numeric Formatting Library - 支持将小写的数字字符串格式化成简体中文,繁体中文,日文和韩文的大写数字字符串。
  2. Japanese Kana Conversion Library - 支持将日文假名(Kana)转化为另一种日文字符。
  3. Japanese Text Alignment Library - 支持日文特有的一种对齐格式。
  4. Japanese Yomi Auto-Completion Library - 类库支持感知日文输入法的输入自动完成和一个文本框控件的示例。
  5. Korean Auto Complete TextBox Control - 支持韩文输入法的智能感知和输入自动完成的文本框控件。
  6. Simplified Chinese Pin-Yin Conversion Library - 支持获取简体中文字符的常用属性比如拼音,多音字,同音字,笔画数。
  7. Traditional Chinese to Simplified Chinese Conversion Library and Add-In Tool - 支持简繁体中文之间的转换。该组件还包含一个Visual Studio集成开发环境中的插件(Add-in)支持简繁体中文资源文件之间的转换。

下载完毕后,进行解压,里面有7个msi文件,其中:CHSPinYinConv.msi就是汉字拼音相关的,CHTCHSConv.msi是进行简体与繁体进行相互转换的,值安装这2个msi即可。安装完毕后,需要在VS里添加引用,分别引用:C:\Program Files\Microsoft Visual Studio International Pack\Simplified Chinese Pin-Yin Conversion Library下和C:\Program Files\Microsoft Visual Studio International Pack\Traditional Chinese to Simplified Chinese Conversion Library and Add-In Tool下的dll即可使用。

下面是Microsoft.International.Converters.PinYinConverter.ChineseChar类的成员:

封装了简体中文的读音和笔画等基本信息。

成员类型成员描述
  ChineseCharNew(Char)
ChineseChar类的构造函数。
  ChineseCharacter
获取这个汉字字符。
  CompareStrokeNumber(Char)
将给出的字符和实例字符的笔画数进行比较。
静态成员 GetCharCount(Int16)
检索具有指定笔画数的字符个数。
静态成员 GetChars(String)
获取给定拼音的所有同音字。
静态成员 GetChars(Int16)
检索具有指定笔画数的所有字符串。
静态成员 GetHomophoneCount(String)
检索具有指定拼音的字符数。
静态成员 GetStrokeNumber(Char)
检索指定字符的笔画数。
  HasSound(String)
识别字符是否有指定的读音。
  IsHomophone(Char)
识别给出的字符是否是实例字符的同音字。
静态成员 IsHomophone(Char, Char)
识别给出的两个字符是否是同音字。
  IsPolyphone
获取这个字符是否是多音字。
静态成员 IsValidChar(Char)
识别给出的字符串是否是一个有效的汉字字符。
静态成员 IsValidPinyin(String)
识别给出的拼音是否是一个有效的拼音字符串。
静态成员 IsValidStrokeNumber(Int16)
识别给出的笔画数是否是一个有效的笔画数。
  PinyinCount
获取这个字符的拼音个数。
  Pinyins
获取这个字符的拼音。
  StrokeNumber
获取这个字符的笔画数。
 

其他信息请参与随机安装的chm帮助文件。

该类库的功能概述

Visual Studio International Feature Pack 1.0版的包括以下功能:

  • East Asia Numeric Formatting Library - 支持将小写的数字字符串格式化成简体中文,繁体中文,日文和韩文的大写数字字符串。
  • Japanese Kana Conversion Library - 支持将日文假名(Kana)转化为另一种日文字符。
  • Japanese Text Alignment Library - 支持日文特有的一种对齐格式。
  • Japanese Yomi Auto-Completion Library - 类库支持感知日文输入法的输入自动完成和一个文本框控件的示例。
  • Korean Auto Complete TextBox Control - 支持韩文输入法的智能感知和输入自动完成的文本框控件。
  • Simplified Chinese Pin-Yin Conversion Library - 支持获取简体中文字符的常用属性比如拼音,多音字,同音字,笔画数。
  • Traditional Chinese to Simplified Chinese Conversion Library and Add-In Tool - 支持简繁体中文之间的转换。该组件还包含一个Visual Studio集成开发环境中的插件(Add-in)支持简繁体中文资源文件之间的转换。

    Visual Studio International Feature Pack 2.0 是对 1.0 版本的扩展,包含一组控件和类库:

    • Yomigana Framework 包含了类库和控件。
      • 类库:Yomigana 类库容许对串(string)类型加注 Yomigana,同时也支持对一般类型的注解功能,任何实现了IEnumerable接口的对象都可以被串类型和泛型的实例注解。为了简化复杂的注解字符串比较特设计了支持各种日文比较选项的比较类型。
        • 通用的一些类,用泛型实现对一个可枚举的类型注音。
        • 特殊目的的一些类,用以上泛型实现对一个字符串用某种类型中注音。
        • 特殊目的的一些StringAnnotation 类,用以上泛型实现对一个字符串用字符串注音,包括解析和格式化功能。
        • 一个比较器类,使用以上类实现比较字符串。
        • 一个实现了 IEnumerable <string> 的数据结构,把一个字符串分成枚举的字符串段,并用 IEnumerator <string> 输出。
      • 控件:
        • 增强的Ajax/WPF/WinForm 文本框(TextBox)控件 用来根据用户的输入捕获读音。
        • 一个增强的使用Ruby标签的ASP.NET Label控件。
    • Chinese Text Alignment Class Library and TextBox Controls 包含支持简体中文文本对齐的WinForm 和 WPF 的TextBox控件, 以及供帮助开发人员很容易地按中文文本对齐显示字符串的一个类库。
    • Chinese Auto Complete Class Library and TextBox Controls 包含支持感知简体中文和繁体中文输入法并自动完成的WinForm 和 WPF 的TextBox控件, 以及供开发人员很容易地向标准控件添加感知输入法并自动完成功能的一个类库。
    • Korean Auto Complete Class Library and ComboBox Controls 包含支持感知韩语输入法并自动完成的WinForm 和 WPF 的ComboBox控件, 以及供开发人员很容易地向标准控件添加感知输入法并自动完成功能的一个类库。
    • Numeric Formatting Class Library 包含支持五种语言的数字格式化成文字的类, 2.0 版支持格式化阿拉伯数字为阿拉伯文字。


    可见,这个类库在开发国际化程序时是非常实用的。 

  • 完成上面的工作后,使用方法就非常简单了,下面看代码:

    using Microsoft.International.Converters.PinYinConverter;//导入拼音相关

    namespace WebApplication2
    {
        
    public class Class1
        {   
            
    /// <summary> 
            
    /// 汉字转化为拼音
            
    /// </summary> 
            
    /// <param name="str">汉字</param> 
            
    /// <returns>全拼</returns> 
            public static string GetPinyin(string str)
            {
                
    string r = string.Empty;
                
    foreach (char obj in str)
                {
                    
    try
                    {
                        ChineseChar chineseChar 
    = new ChineseChar(obj);
                        
    string t = chineseChar.Pinyins[0].ToString();
                        r 
    += t.Substring(0, t.Length - 1);
                    }
                    
    catch
                    {
                        r 
    += obj.ToString();
                    }
                }
                
    return r;
            }

            
    /// <summary> 
            
    /// 汉字转化为拼音首字母
            
    /// </summary> 
            
    /// <param name="str">汉字</param> 
            
    /// <returns>首字母</returns> 
            public static string GetFirstPinyin(string str)
            {
                
    string r = string.Empty;
                
    foreach (char obj in str)
                {
                    
    try
                    {
                        ChineseChar chineseChar 
    = new ChineseChar(obj);
                        
    string t = chineseChar.Pinyins[0].ToString();
                        r 
    += t.Substring(01);
                    }
                    
    catch
                    {
                        r 
    += obj.ToString();
                    }
                }
                
    return r;
            }
        }
    }

    调用方法:(注意先引用)

    GetPinyin("风影");//获取全拼
    GetFirstPinyin("风影");//获取首字母

    是不是非常简单呢?有了这个类库就省事多了!顺便再补充一下繁简体互转的方法,某些时候可能会用到:

    先导入

    using Microsoft.International.Converters.TraditionalChineseToSimplifiedConverter;

            /// <summary> 
            
    /// 简体转换为繁体
            
    /// </summary> 
            
    /// <param name="str">简体字</param> 
            
    /// <returns>繁体字</returns> 
            public static string GetTraditional(string str)
            {
                
    string r = string.Empty;
                r 
    = ChineseConverter.Convert(str, ChineseConversionDirection.SimplifiedToTraditional);
                
    return r;
            }
            
    /// <summary> 
            
    /// 繁体转换为简体
            
    /// </summary> 
            
    /// <param name="str">繁体字</param> 
            
    /// <returns>简体字</returns> 
            public static string GetSimplified(string str)
            {
                
    string r = string.Empty;
                r 
    = ChineseConverter.Convert(str, ChineseConversionDirection.TraditionalToSimplified);
                
    return r;
            }

    posted @ 2011-06-04 20:19 青草随缘 阅读(87) 评论(0) 编辑

    2011年5月17日

    C# .NET学习经验总结(转帖)

    C# .NET学习经验总结

    作者: 佚名  来源: 51CTO博客  发布时间: 2009-10-22 16:09  阅读: 3376 次   全屏阅读  [收藏]  

      1. 装箱、拆箱还是别名

      许多介绍C# .NET学习经验的书上都有介绍 int -> Int32 是一个装箱的过程,反之则是拆箱的过程。许多其它变量类型也是如此,如:short <-> Int16,long <-> Int64 等。对于一般的程序员来说,大可不必去了解这一过程,因为这些装箱和拆箱的动作都是可以自动完成的,不需要写代码进行干预。但是我们需要记住这些类型之间 的关系,所以,我们使用“别名”来记忆它们之间的关系。

      C# 是全面向对象的语言,比 Java 的面向对象都还彻底——它把简单数据类型通过默认的装箱动作封装成了类。Int32、Int16、Int64 等就是相应的类名,而那些我们熟悉的、简单易记的名称,如 int、short、long 等,我们就可以把它称作是 Int32、Int16、Int64 等类型的别名。那么除了这三种类型之外,还有哪些类有“别名”呢?常用的有如下一些:

      bool -> System.Boolean (布尔型,其值为 true 或者 false)
      char -> System.Char (字符型,占有两个字节,表示 1 个 Unicode 字符)
      byte -> System.Byte (字节型,占 1 字节,表示 8 位正整数,范围 0 ~ 255)
      sbyte -> System.SByte (带符号字节型,占 1 字节,表示 8 位整数,范围 -128 ~ 127)
      ushort -> System.UInt16 (无符号短整型,占 2 字节,表示 16 位正整数,范围 0 ~ 65,535)
      uint -> System.UInt32 (无符号整型,占 4 字节,表示 32 位正整数,范围 0 ~ 4,294,967,295)
      ulong -> System.UInt64 (无符号长整型,占 8 字节,表示 64 位正整数,范围 0 ~ 大约 10 的 20 次方)
      short -> System.Int16 (短整型,占 2 字节,表示 16 位整数,范围 -32,768 ~ 32,767)
      int -> System.Int32 (整型,占 4 字节,表示 32 位整数,范围 -2,147,483,648 到 2,147,483,647)
      long -> System.Int64 (长整型,占 8 字节,表示 64 位整数,范围大约 -(10 的 19) 次方 到 10 的 19 次方)
      float -> System.Single (单精度浮点型,占 4 个字节)
      double -> System.Double (双精度浮点型,占 8 个字节)

      我们可以用下列代码做一个实验:

     private void TestAlias() {  
    // this.textBox1 是一个文本框,类型为 System.Windows.Forms.TextBox
    // 设计中已经将其 Multiline 属性设置为 true

    byte a = 1; char b = 'a'; short c = 1;
    int d = 2; long e = 3; uint f = 4; bool g = true;
    this.textBox1.Text = "";
    this.textBox1.AppendText("byte -> " + a.GetType().FullName + "\n");
    this.textBox1.AppendText("char -> " + b.GetType().FullName + "\n");
    this.textBox1.AppendText("short -> " + c.GetType().FullName + "\n");
    this.textBox1.AppendText("int -> " + d.GetType().FullName + "\n");
    this.textBox1.AppendText("long -> " + e.GetType().FullName + "\n");
    this.textBox1.AppendText("uint -> " + f.GetType().FullName + "\n");
    this.textBox1.AppendText("bool -> " + g.GetType().FullName + "\n");
    }

      在窗体中新建一个按钮,并在它的单击事件中调用该 TestAlias() 函数,运行结果如下:

      byte -> System.Byte
      char -> System.Char
      short -> System.Int16
      int -> System.Int32
      long -> System.Int64
      uint -> System.UInt32
      bool -> System.Boolean

      这足以说明各别名对应的类!

      2. 数值类型之间的相互转换

      这里所说的数值类型包括 byte, short, int, long, fload, double 等,根据这个排列顺序,各种类型的值依次可以向后自动进行转换。举个例来说,把一个 short 型的数据赋值给一个 int 型的变量,short 值会自动行转换成 int 型值,再赋给 int 型变量。如下例:

     private void TestBasic() 
    {
    byte a = 1; short b = a; int c = b;
    long d = c; float e = d; double f = e;
    this.textBox1.Text = "";
    this.textBox1.AppendText("byte a = " + a.ToString() + "\n");
    this.textBox1.AppendText("short b = " + b.ToString() + "\n");
    this.textBox1.AppendText("int c = " + c.ToString() + "\n");
    this.textBox1.AppendText("long d = " + d.ToString() + "\n");
    this.textBox1.AppendText("float e = " + e.ToString() + "\n");
    this.textBox1.AppendText("double f = " + f.ToString() + "\n");
    }

      译顺利通过,运行结果是各变量的值均为 1;当然,它们的类型分别还是 System.Byte 型……System.Double 型。现在我们来试试,如果把赋值的顺序反过来会怎么样呢?在 TestBasic() 函数中追加如下语句:

      int g = 1;  
    short h = g;
    this.textBox1.AppendText("h = " + h.ToString() + "\n");

      结果编译报错:G:\Projects\Visual C#\Convert\Form1.cs(118): 无法将类型“int”隐式转换为“short”其中,Form1.cs 的 118 行即 short h = g 所在行。

      这个时候,如果我们坚持要进行转换,就应该使用强制类型转换,这在 C 语言中常有提及,就是使用“(类型名) 变量名”形式的语句来对数据进行强制转换。如上例修改如下:

    short g = 1;  
    byte h = (byte) g; // 将 short 型的 g 的值强制转换成 short 型后再赋给变量 h
    this.textBox1.AppendText("h = " + h.ToString() + "\n");

      编译通过,运行结果输出了 h = 1,转换成功。
      但是,如果我们使用强制转换,就不得不再考虑一个问题:short 型的范围是 -32768 ~ 23767,而 byte 型的范围是 0 ~ 255,那么,如果变量 g 的大小超过了 byte 型的范围又会出现什么样的情况呢?我们不妨再一次改写代码,将值改为 265,比 255 大 10

    short g = 265; //265 = 255 + 10  
    byte h = (byte) g;
    this.textBox1.AppendText("h = " + h.ToString() + "\n");

      编译没有出错,运行结果却不是 h = 265,而是 h = 9。
      因此,我们在进行转换的时候,应当注意被转换的数据不能超出目标类型的范围。 这不仅体现在多字节数据类型(相对,如上例的 short) 转换为少字节类型(相对,如上例的 byte) 时,也体现在字节数相同的有符号类型和无符号类型之间,如将 byte 的 129 转换为 sbyte 就会溢出。这方面的例子大同小异,就不详细说明了。

      3. 字符的 ASCII 码和 Unicode 码

      很多时候我们需要得到一个英文字符的 ASCII 码,或者一个汉字字符的 Unicode 码,或者从相关的编码查询它是哪一个字符的编码。很多人,尤其是从 VB 程序序转过来学 C# 的人,会报怨 C# 里为什么没有提供现成的函数来做这个事情——因为在 VB 中有 Asc() 函数和 Chr() 函数用于这类转换。
    但是如果你学过 C,你就会清楚,我们只需要将英文字符型数据强制转换成合适的数值型数据,就可以得到相应的 ASCII 码;反之,如果将一个合适的数值型数据强制转换成字符型数据,就可以得到相应的字符。
      C# 中字符的范围扩大了,不仅包含了单字节字符,也可以包含双字节字符,如中文字符等。而在字符和编码之间的转换,则仍延用了 C 语言的做法——强制转换。不妨看看下面的例子

     private void TestChar()
     {
    char ch = 'a'; short ii = 65;
    this.textBox1.Text = "";
    this.textBox1.AppendText
    ("The ASCII code of \'" + ch + "\' is: " + (short) ch + "\n");

    this.textBox1.AppendText
    ("ASCII is " + ii.ToString() + ", the char is: " + (char) ii + "\n");
    char cn = '中'; short uc = 22478;

    this.textBox1.AppendText
    ("The Unicode of \'" + cn + "\' is: " + (short) cn + "\n");
    this.textBox1.AppendText
    ("Unicode is " + uc.ToString() + ", the char is: " + (char) uc + "\n");
    }

      它的运行结果是

      The ASCII code of 'a' is: 97
      ASCII is 65, the char is: A
      The Unicode of '中' is: 20013
      Unicode is 22478, the char is: 城

      从这个例子中,我们便能非常清楚的了解——通过强制转换,可以得以字符的编码,或者得到编码表示的字符。如果你需要的不是 short 型的编码,请参考第 1 条进行转换,即可得到 int 等类型的编码值。

      4. 数值字符串和数值之间的转换

      首先,我们得搞明白,什么是数值字符串。我们知道,在 C# 中,字符串是用一对双引号包含的若干字符来表示的,如 "123"。而 "123" 又相对特殊,因为组成该字符串的字符都是数字,这样的字符串,就是数值字符串。在我们的眼中,这即是一串字符,也是一个数,但计算机却只认为它是一个字符 串,不是数。因此,我们在某些时候,比如输入数值的时候,把字符串转换成数值;而在另一些时候,我们需要相反的转换。

      将数值转换成字符串非常简单,因为每一个类都有一个 void ToString() 方法。所有数值型的 void ToString() 方法都能将数据转换为数值字符串。如 123.ToSting() 就将得到字符串 "123"。

      那么反过来,将数值型字符串转换成数值又该怎么办呢?我们仔细查找一下,会发现 short, int, float 等数值类型均有一个 static Parse() 函数。这个函数就是用来将字符串转换为相应数值的。我们以一个 float 类型的转换为例: float f = float.Parse("543.21"); 其结果 f 的值为 543.21F。当然,其它的数值类型也可以使用同样的方法进行转换,下面的例子可以更明确的说明转换的方法:

    private void TestStringValue() 
    {
    float f = 54.321F;
    string str = "123";
    this.textBox1.Text = "";
    this.textBox1.AppendText("f = " + f.ToString() + "\n");
    if (int.Parse(str) == 123)
    {
    this.textBox1.AppendText("str convert to int successfully.");
    }
    else
    {
    this.textBox1.AppendText("str convert to int failed.");
    }
    }

      运行结果:

      f = 54.321
      str convert to int successfully.

      5. 字符串和字符数组之间的转换

      字符串类 System.String 提供了一个 void ToCharArray() 方法,该方法可以实现字符串到字符数组的转换。如下例:

       private void TestStringChars() 
    {
    string str = "mytest";
    char[] chars = str.ToCharArray();
    this.textBox1.Text = "";
    this.textBox1.AppendText("Length of \"mytest\" is " + str.Length + "\n");
    this.textBox1.AppendText("Length of char array is " + chars.Length + "\n");
    this.textBox1.AppendText("char[2] = " + chars[2] + "\n");
    }

      例中以对转换转换到的字符数组长度和它的一个元素进行了测试,结果如下:

      Length of "mytest" is 6
      Length of char array is 6
      char[2] = t

      可以看出,结果完全正确,这说明转换成功。那么反过来,要把字符数组转换成字符串又该如何呢?
      我们可以使用 System.String 类的构造函数来解决这个问题。System.String 类有两个构造函数是通过字符数组来构造的,即 String(char[]) 和 String[char[], int, int)。后者之所以多两个参数,是因为可以指定用字符数组中的哪一部分来构造字符串。而前者则是用字符数组的全部元素来构造字符串。我们以前者为例,在 TestStringChars() 函数中输入如下语句:

     char[] tcs = {'t', 'e', 's', 't', ' ', 'm', 'e'};  
    string tstr = new String(tcs);
    this.textBox1.AppendText("tstr = \"" + tstr + "\"\n");

      运行结果输入 tstr = "test me",测试说明转换成功。
      实际上,我们在很多时候需要把字符串转换成字符数组只是为了得到该字符串中 的某个字符。如果只是为了这个目的,那大可不必兴师动众的去进行转换,我们只需要使用 System.String 的 [] 运算符就可以达到目的。请看下例,再在 TestStringChars() 函数中加入如如下语名:

     char ch = tstr[3];  
    this.textBox1.AppendText("\"" + tstr + "\"[3] = " + ch.ToString());

      正确的输出是 "test me"[3] = t,经测试,输出正确。

      6. 字符串和字节数组之间的转换

      如果还想从 System.String 类中找到方法进行字符串和字节数组之间的转换,恐怕你会失望了。为了进行这样的转换,我们不得不借助另一个 类:System.Text.Encoding。该类提供了 bye[] GetBytes(string) 方法将字符串转换成字节数组,还提供了 string GetString(byte[]) 方法将字节数组转换成字符串。

      System.Text.Encoding 类似乎没有可用的构造函数,但我们可以找到几个默认的 Encoding,即 Encoding.Default(获取系统的当前 ANSI 代码页的编码)、Encoding.ASCII(获取 7 位 ASCII 字符集的编码)、Encoding.Unicode(获取采用 Little-Endian 字节顺序的 Unicode 格式的编码)、Encoding.UTF7(获取 UTF-7 格式的编码)、Encoding.UTF8(获取 UTF-8 格式的编码) 等。这里主要说说 Encoding.Default 和 Encoding.Unicode 用于转换的区别。

      在字符串转换到字节数组的过程中,Encoding.Default 会将每个单字节字符,如半角英文,转换成 1 个字节,而把每个双字节字符,如汉字,转换成 2 个字节。而 Encoding.Unicode 则会将它们都转换成两个字节。我们可以通过下列简单的了解一下转换的方法,以及使用 Encoding.Default 和 Encodeing.Unicode 的区别:

    private void TestStringBytes() 
    {
    string s = "C#语言";
    byte[] b1 = System.Text.Encoding.Default.GetBytes(s);
    byte[] b2 = System.Text.Encoding.Unicode.GetBytes(s);
    string t1 = "", t2 = "";
    foreach (byte b in b1)
    {
    t1 += b.ToString("") + " ";
    }
    foreach (byte b in b2)
    {
    t2 += b.ToString("") + " ";
    }
    this.textBox1.Text = "";
    this.textBox1.AppendText("b1.Length = " + b1.Length + "\n");
    this.textBox1.AppendText(t1 + "\n");
    this.textBox1.AppendText("b2.Length = " + b2.Length + "\n");
    this.textBox1.AppendText(t2 + "\n");
    }

      运行结果如下,不说详述,相信大家已经明白了。

      b1.Length = 6
      67 35 211 239 209 212 
      b2.Length = 8
      67 0 35 0 237 139 0 138

      将字节数组转换成字符串,使用 Encoding 类的 string GetString(byte[]) 或 string GetString(byte[], int, int) 方法,具体使用何种 Encoding 还是由编码决定。在 TestStringBytes() 函数中添加如下语句作为实例:

    byte[] bs = {97, 98, 99, 100, 101, 102};  
    string ss = System.Text.Encoding.ASCII.GetString(bs);
    this.textBox1.AppendText("The string is: " + ss + "\n");

      运行结果为:The string is: abcdef

      7. 各种数值类型和字节数组之间的转换

      在第 1 条中我们可以查到各种数值型需要使用多少字节的空间来保存数据。将某种数值类型的数据转换成字节数组的时候,得到的一定是相应大小的字节数组;同样,需要 把字节数组转换成数值类型,也需要这个字节数组大于相应数值类型的字节数。现在介绍此类转换的主角:System.BitConverter。该类提供了 byte[] GetBytes(...) 方法将各种数值类型转换成字节数组,也提供了 ToInt32、ToInt16、ToInt64、ToUInt32、ToSignle、ToBoolean 等方法将字节数组转换成相应的数值类型。

      由于这类转换通常只是在需要进行较细微的编码/解码操作时才会用到,所以这里就不详细叙述了,仅把 System.BitConverter 类介绍给大家。

      8. 转换成十六进制

      任何数据在计算机内部都是以二进制保存的,所以进制与数据的存储无关,只与输入输出有关。所以,对于进制转换,我们只关心字符串中的结果。

      在上面的第 4 条中提到了 ToString() 方法可以将数值转换成字符串,不过在字符串中,结果是以十进制显示的。现在我们带给它加一些参数,就可以将其转换成十六进制——使用 ToString(string) 方法。这里需要一个 string 类型的参数,这就是格式说明符。十六进制的格式说明符是 "x" 或者 "X",使用这两种格式说明符的区别主要在于 A-F 六个数字:"x" 代表 a-f 使用小写字母表示,而 "X" 而表示 A-F 使用大字字母表示。如下例:

     private void TestHex() 
    {
       int a = 188;
       this.textBox1.Text = "";
       this.textBox1.AppendText("a(10) = " + a.ToString() + "\n");
       this.textBox1.AppendText("a(16) = " + a.ToString("x") + "\n");
       this.textBox1.AppendText("a(16) = " + a.ToString("X") + "\n");
    }

      运行结果如下:

      a(10) = 188
      a(16) = bc
      a(16) = BC

      这时候,我们可能有另一种需求,即为了显示结果的整齐,我们需要控制十六进制表示的长度,如果长度不够,用前导的 0 填补。解决这个问题,我们只需要在格式说明符“x”或者“X”后写上表示长度的数字就行了。比如,要限制在 4 个字符的长度,可以写成“X4”。在上例中追加一句:

    this.textBox1.AppendText("a(16) = " + a.ToString("X4") + "\n"); 

      其结果将输出 a(16) = 00BC。

      现在,我们还要说一说如何将一个表示十六进制数的字符串转换成整型。这一转换,同样需要借助于 Parse() 方法。这里,我需要 Parse(string, System.Globalization.NumberStyles) 方法。第一个参数是表示十六进制数的字符串,如“AB”、“20”(表示十进制的 32) 等。第二个参数 System.Globalization.NumberStyles 是一个枚举类型,用来表示十六进制的枚举值是 HexNumber。因此,如果我们要将“AB”转换成整型,就应该这样写:int b = int.Parse("AB", System.Globalization.NumberStyles.HexNumber),最后得到的 b 的值是 171。

      9. 日期型数据和长整型数据之间的转换

      为什么要将日期型数据转换为长整型数据呢?原因很多,但就我个人来说,经常将它用于数据库的日期存储。由于各种数据库对日期型的定义和处理是不一样 的,各种语言对日期型数据的定义的处理也各不相同,因为,我宁愿将日期型数据转换成长整型再保存到数据库中。虽然也可以使用字符串来保存,但使用字符串也 会涉及到许多问题,如区域等问题,而且,它需要比保存长整型数据更多的空间。

      日期型数据,在 C# 中的参与运算的时候,应该也是转换为长整型数据来运算的。它的长整型值是自 0001 年 1 月 1 日午夜 12:00 以来所经过时间以 100 毫微秒为间隔表示时的数字。这个数在 C# 的 DateTime 中被称为 Ticks(刻度)。DateTime 类型有一个名为 Ticks 的长整型只读属性,就保存着这个值。如此,要从一个 DataTime 型数据得到 long 型值就非常简单了,只需要读出 DataTime 对象的 Ticks 值即可,如:

     long longDate = DateTime.Now.Ticks; 

      DateTime 的构造函数中也提供了相应的,从长整型数据构造 DateTime 型数据的函数:DateTime(long)。如:

    DateTime theDate = new DateTime(longDate); 

      但这样对于很多 VB6 程序员来说,是给他们出了一道难题,因为 VB6 中的日期型数据内部是以 Double 型表示的,将其转换为长整型后得到的仅仅是日期,而没有时间。如何协调这两种日期类型呢?
      System.DateTime 提供了 double ToOADate() 和 static DateTime FromOADate(double) 两个函数来解决这个问题。前者将当前对象按原来的 double 值输出,后者则从一个 double 值获得一个 System.DateTime 对象。举例如下:

    private void TestDateTimeLong() 
    {
    double doubleDate = DateTime.Now.ToOADate();
    DateTime theDate = DateTime.FromOADate(doubleDate);
    this.textBox1.Text = "";
    this.textBox1.AppendText("Double value of now: " +
         doubleDate.ToString() + "\n");
    this.textBox1.AppendText("DateTime from double value: " +
         theDate.ToString() + "\n");
    }

      运行结果:

      Double value of now: 37494.661541713
      DateTime from double value: 2002-8-26 15:52:37

      10. 格式化日期型数据

      编程的过程中,通常需要将日期型数据按照一定的格式输出,当然,输出结果肯定是字符串。为此,我们需要使用 System.DateTime 类的 ToString() 方法,并为其指定格式字符串。MSDN 中,System.Globalization.DateTimeFormatInfo 类的概述里对模式字符串有非常详细的说明,因此,这里我只对常用的一些格式进行说明,首先请看下表:

    d

    月中的某一天

    一位数的日期没有前导零

    dd

    月中的某一天

    一位数的日期有一个前导零

    ddd

    周中某天的缩写名称

    在 AbbreviatedDayNames 中定义

    dddd

    周中某天的完整名称

    在 DayNames 中定义

    M

    月份数字

    一位数的月份没有前导零

    MM

    月份数字

    一位数的月份有一个前导零

    MMM

    月份的缩写名称

    在 AbbreviatedMonthNames 中定义

    MMMM

    月份的完整名称

    在 MonthNames 中定义

    y

    不包含纪元的年份

    如果不包含纪元的年份小于 10,则显示不具有前导零的年份

    yy

    不包含纪元的年份

    如果不包含纪元的年份小于 10,则显示具有前导零的年份

    yyyy

    包括纪元的四位数的年份

     

    h

    12 小时制的小时

    一位数的小时数没有前导零

    hh

    12 小时制的小时

    一位数的小时数有前导零

    H

    24 小时制的小时

    一位数的小时数没有前导零

    HH

    24 小时制的小时

    一位数的小时数有前导零

    m

    分钟

    一位数的分钟数没有前导零

    mm

    分钟

    一位数的分钟数有一个前导零

    s

    一位数的秒数没有前导零

    ss

    一位数的秒数有一个前导零

      为了便于大家的理解,不妨试试下面的程序:

    private void TestDateTimeToString() 
    {
    DateTime now = DateTime.Now;
    string format;
    this.textBox1.Text = "";
    format = "yyyy-MM-dd HH:mm:ss";
    this.textBox1.AppendText(format + ": " + now.ToString(format) + "\n");
    format = "yy年M日d日";
    this.textBox1.AppendText(format + ": " + now.ToString(format) + "\n");
    }

      这段程序将输出结果:

      yyyy-MM-dd HH:mm:ss: 2002-08-26 17:03:04
      yy年M日d日: 02年8日26日

      这时候,又出现一个问题,如果要输出的文本信息中包含格式字符怎么办?如

      format = "year: yyyy, month: MM, day: dd";  
    this.textBox1.AppendText(now.ToString(format) + "\n");   

      将输出:

      2ear: 2002, 4on下5: 08, 26a2: 26

      这并不是我想要的结果,怎么办呢?有办法——

    format = "\"year\": yyyy, \'month\': MM, \'day\': dd";  
    this.textBox1.AppendText(now.ToString(format) + "\n");

      看,这次运行结果对了:

      year: 2002, month: 08, day: 26

      可以看出,只需要使用单引号或者双引号将文本信息括起来就好。

    posted @ 2011-05-17 16:10 青草随缘 阅读(24) 评论(0) 编辑

    2011年5月3日

    程序设计的 Top 10 做与不做(转自博客园)

    程序设计的 Top 10 做与不做(转自博客园)

     

      今天来和大家分享两个很不错的程序设计「做」与「不做」列表。首先,是 Andres Taylor (安缀斯‧泰勒)写的「Top 10 Things Ten Years of Professional Software DevelopmentHas Taught Me」,翻成中文就是「十年程序设计经验教我的十件事情」。

      原文不长,里面有很多不错的观念,我鼓励你们去读读。以下是中文版:

    1. 面向对象比你想象中的还难很多
    2. 程序设计师最重要的技能:沟通
    3. 你必须要学会说「不」
    4. 如果所有的事项都一样重要,那意思是它们都不重要——无论如何必须把先后顺序排出来
    5. 千万别把事情复杂化
    6. 深入问题的核心,但是不要被困住了
    7. 非常清楚的了解其它人在做的事情,无论是营销、设计、客服
    8. 你的同事就是你最好的老师 (你该试试 Pair Programming)
    9. 无论如何最后的产品必须是好用的

    10. 这世界上总会有一些混蛋

      而至于什么事情应该要避免,大家可以参考 Dare Obasanjo (戴尔‧欧巴桑侯)写的「Top 10 Signs Your Software Project is Doomed」,翻成中文就是「十个软件项目注定失败的迹象」。

    1. 第一个版本就想做太多功能
    2. 采用太新的技术平台
    3. 「复杂的问题,需要复杂的解法…」
    4. 团队人手不足
    5. 成员开始隐藏进度落后的事实和原因(Schedule Chicken)
    6. 不断更改、增加的需求 (Scope Creep)
    7. 不知道客户在哪里
    8. 2.0 症状群——后继版本非要更大、更强、更美(Second System Syndrome)
    9. 与公司里面另一个很有份量的产品竞争(这在创业团队应该不可能发生)

    10. 根本从一开始就选了一个你无法解决的大问题

      以上,跟大家分享,希望能够帮助你们在做的产品更顺利、更成功,加油!

    posted @ 2011-05-03 14:27 青草随缘 阅读(6) 评论(0) 编辑

    2011年5月2日

    (收藏)《博客园精华集》分类索引

    摘要: (收藏)《博客园精华集》分类索引2010-05-24 02:10 by 圣殿骑士, 11769 visits,网摘,收藏,编辑 由于这几年一直热衷于.NET技术,但由于自己项目很忙,也许是自己很懒,所以没能写出好的博文,但养成了每天浏览博客园文章的习惯。转眼间即将扎根五年,收获颇多,但很多时候难免会浪费很多时间在闲逛上,所以找到了一些比较好的文章,这样可以供以后查阅(毕竟收藏夹不是万能,重装电脑就玩完了),也方便学习更多他人经验。感谢这些博文的作者和博客园精华集的整理者,同时希望博客园以后能继续这样归类,方便检索。也祝博客能蒸蒸日上,希望大家能多共享一些经典文章!(收藏)《博客园精华集》WEB阅读全文

    posted @ 2011-05-02 21:53 青草随缘 阅读(14) 评论(0) 编辑

    2011年1月15日

    面向接口编程详解(一)——思想基础——转载

    摘要: 转载自——http://www.cnblogs.com/leoo2sk/archive/2008/04/10/1146447.html我想,对于各位使用面向对象编程语言的程序员来说,“接口”这个名词一定不陌生,但是不知各位有没有这样的疑惑:接口有什么用途?它和抽象类有什么区别?能不能用抽象类代替接口呢?而且,作为程序员,一定经常听到“面向接口编程”这个短语,那么它是什么意思?有什么思想内涵?和面向对象编程是什么关系?本文将一一解答这些疑问。1.面向接口编程和面向对象编程是什么关系首先,面向接口编程和面向对象编程并不是平级的,它并不是比面向对象编程更先进的一种独立的编程思想,而是附属于面向对象思阅读全文

    posted @ 2011-01-15 16:31 青草随缘 阅读(27) 评论(0) 编辑

    2010年12月30日

    101个微软提供的Visual Studio 2005示例\CS101SamplesBCL\Stopwatch

    摘要: using System;namespace System.Diagnostics{ // 摘要: // 提供一组方法和属性,可用于准确地测量运行时间。 public class Stopwatch { // 摘要: // 获取以每秒刻度数表示的计时器频率。此字段为只读。 public static readonly long Frequency; // // 摘要: // 指示计时器是否基于高分辨率性能计数器。此字段为只读。 public static readonly bool IsHighResolution; // 摘要: // 初始化 System.Diagnostics.Stopw阅读全文

    posted @ 2010-12-30 15:37 青草随缘 阅读(135) 评论(0) 编辑

    2010年11月22日

    编程八步走 (转载)

    摘要: 火麒麟不以物喜,不以己悲。编程八步走  我编程是一个很复杂的过程,只要我们找准了他的方法,就又是一个很容易的过程。说他复杂是因为他考虑的事情非常之多,要想做一个好的软件出来,需要考虑的非常全面。做的时候工作量也是不容小视的,现在的公司基本都是团队合作做同一个软件。但是纵使是团队也好,个人也罢。都必须找准步骤,才能事半功倍。  下面是我总结的编程八步:  1.系统流程分析  2.可行性分析  3.需...阅读全文

    posted @ 2010-11-22 19:23 青草随缘 阅读(20) 评论(0) 编辑

    2010年11月12日

    路过的人给点建议!谢谢

    摘要: 首先感谢路过的朋友,给点建议,我写博客就是希望能够和大家沟通。  最近在写医保接口程序,基本功能开发完成了,还有一部分功能没有开发,打算用接下来的两天周末时间完成。  突然发现自己写的代码原来这么糟糕,基本属于拼凑功能的,从前辈们的代码上复制粘贴下来,然后修改。脑子里没有一个完整的框架。我现在非常的着急,我不想一直这样开发下去,我想把程序完善一下,但是很多东西我都不会。我现在心情非常的烦躁,非常的...阅读全文

    posted @ 2010-11-12 16:06 青草随缘 阅读(67) 评论(0) 编辑

    仅列出标题  下一页

    导航

    统计

    公告