博文
C# 正则表达式(2010-09-28 05:57:00)
摘要:http://www.wangqi.com/html/2006-12/9250.htm
字符语法
语法解释
语法例子
\d
匹配数字(0~9)
‘\d’匹配8,不匹配12;
\D
匹配非数字
‘\D’匹配c,不匹配3;
\w
匹配任意单字符
‘\w\w’ 匹配A3,不匹配@3;
\W
匹配非单字符
‘\W’匹配@,不匹配c;
\s
匹配空白字符
‘\d\s\d’匹配3 d,不匹配abc;
\S
匹配非空字符
‘\S\S\S’匹配A#4,不匹配3 d;
.
匹配任意字符
‘....’匹配A$ 5,不匹配换行;
[…]
匹配括号中任意字符
[b-d]匹配b、c、d, 不匹配e;
[^…]
匹配非括号字符
[^b-z]匹配a,不匹配b-z的字符;
重复语法
语法解释
语法例子
{n}
匹配n次字符
\d{3}匹配\d\d\d,不匹配\d\d或\d\d\d\d
{n,}
匹配n次和n次以上
\w{2}匹配\w\w和\w\w\w以上,不匹配\w
{n,m}
匹配n次上m次下
\s{1,3}匹配\s,\s\s,\s\s\s,不匹配\s\s\s\s
?
匹配0或1次
5?匹配5或0,不匹配非5和0
+
匹配一次或多次
\S+匹配一个以上\S,不匹配非一个以上\S
*
匹配0次以上
\W*匹配0以上\W,不匹配非N*\W
重复语法
语法解释
语法例子
^
定位后面模式开始位置
......
C#的一些运算符(2010-09-28 05:54:00)
摘要:参见《C#高级编程》第四版
is 运算符
is 运算符可以检查对象是否与特定的类型兼容。”兼容”表示对象是该类型,或者派生于该类型。例如,要检查变量是否与object类型兼容:
int i = 10;
if (i is object)
{
Console.WriteLine("i is an object");
}
int和从object继承而来的其他C#数据类型一样,表达式i is object将得到true,并显示信息。
as运算符
as运算符用于执行引用类型的显式类型转换。如果要转换的类型与指定的类型兼容,转换就会成功进行;如果类型不兼容,as运算符就会返回值null。如下面的代码所示,如果object引用不指向string实例,把object引用转换为string就会返回null:
object o1 = "Some String";
object o2 = 5;
string s1 = o1 as string; // s1 = "Some String"
......
C# 生成随机数(2010-09-14 15:47:00)
摘要:使用随机数只需要两步:
(1) 创建随机种子,默认方式是以当前时间作为种子;Random r = new Random()
(2) 取随机数;int i = r.Next(0, 3) //注意这里是取 [0, 3)的整数,但是取不到3
Random ranobj = new Random();
foreach (SangoWujiang w in wujiangs)
{
int i = (int)w.Force - 1 + ranobj.Next(0, 3);
if (i < 0)
{
w.Force = 0;
&nbs......
实现IFormattable接口的例子(2010-09-08 20:26:00)
摘要:参见C#高级编程(第4版)第8章 字符串和正则表达式
class Program
{
static void Main(string[] args)
{
Vector v1 = new Vector(1, 32, 5);
Vector v2 = new Vector(845.4, 54.3, -7.8);
Console.WriteLine("\nIn IJK format, \nv1 is {0,30:IJK}\nv2 is {1,30:IJK}", v1, v2);
Console.WriteLine("\nIn default format, \nv1 is {0,30}\nv2 is {1,30}", v1, v2);
Console.WriteLine("\nIn VE format, \nv1 is {0,30:VE}\nv2 is {1,30:VE}", v1, v2);
}
}
class Vector : IForma......
什么是装箱和拆箱(2010-09-08 20:25:00)
摘要:转自 http://blog.csdn.net/yuyu622/archive/2007/09/07/1776604.aspx
装箱(boxing)和拆箱(unboxing)是.NET提出得新概念!
.NET的所有类型都是由基类System.Object继承过来的,包括最常用的基础类型:int, byte, short,bool等等,就是说所有的事物都是对象。如果申明这些类型得时候都在堆(HEAP)中分配内存,会造成极低的效率!
.NET如何解决这个问题得了?正是通过将类型分成值型(value)和引用型(referencetype),C#中定义的值类型包括原类型(Sbyte、Byte、Short、Ushort、Int、Uint、Long、Ulong、Char、Float、Double、Bool、Decimal)、枚举(enum)、结构(struct),引用类型包括:类、数组、接口、委托、字符串等。
值型就是在栈中分配内存,在申明的同时就初始化,以确保数据不为NULL;
引用型是在堆中分配内存,初始化为null,引用型是需要GARBAGE COLLECTION来回收内存的,值型不用,超出了作用范围,系统就会自动释放!
下面就来说装箱和拆箱的定义!
装箱就是隐式的将一个值型转换为引用型对象。比如:
int i=0;
Syste.Object obj=i;
这个过程就是装箱!就是将i装箱!
拆箱就是将一个引用型对象转换成任意值型!比如:
int i=0;
System.Object obj=i;
int j=(int)obj;
这个过程前2句是将i装箱,后一句是将obj拆箱!
再写个代码,看看进行了几次装拆箱!
int i=0;
System.Object obj=i;
Console.WriteLine(i+","+(int)obj);
其中共发生了3次装箱和一次拆箱!^_^,看出来了吧?!
第一次是将i装箱,第2次是输出的时候将i转换成string类型,而string类型为引用类型,即又是装箱,第三次装箱就是(int)obj的转换成string类型,装箱!拆箱就是(int)obj,将obj拆箱!!
再举一个例子,
public enum TimeOfDay
{
Mo......
C# 命名空间嵌套(2009-11-26 00:20:00)
摘要:下面是一个简单的例子。注意 IBankAccount 是在 SaverAccount 的上一层命名空间。
由下面这个例子可以看出,嵌套的命名空间可以识别上层命名空间内的东西。
namespace Wrox.ProCSharp
{
public interface IBankAccount
{
void PayIn(decimal amount);
bool Withdraw(decimal amount);
decimal Balance
{
get;
}
}
}
namespace Wrox.ProCSharp.Vennus
{
public class SaverAccount : IBankAccount
{
private decimal balance;
public void PayIn(decimal amount)
{
......
C# 静态类(2009-11-24 20:36:00)
摘要:参见《C#高级编程》第四版
如果类只包含静态的方法和属性,该类就可以是静态的。不能创建静态类的实例。使用static 关键字,编译器可以检查以后是否给该类添加了实例成员。如果是,就生成一个编译错误。这可以确保不创建静态类的实例。
static class StaticUtilities
{
public static void HelperMethod()
{
}
}
调用HelperMethod()不需要StaticUtilities类型的对象。
StaticUtilities.HelperMethod();......
C# 只读字段(2009-11-24 19:13:00)
摘要:参考《C#高级编程》第四版
只读字段可以在构造函数中给只读字段赋值,但不能在其他地方赋值,只读字段还可以是一个实例字段,而不是静态字段,类的每个实例可以有不同的值。与const字段不同,如果要把字段设置为静态,就必须显式声明。
如果有一个编辑文档的MDI程序,因为要注册,需要限制可以同时打开的文档数。现在假定要销售该软件的不同版本,而且顾客可以升级他们的版本,以便同时打开更多的文档。显然,不能再源代码中队最大文档数进行硬编程。而是需要一个字段表示这个最大文档数。这个字段必须是只读的---每次安装程序时,从注册表或其他文件存储中读取。代码如下所示:
public class DocumentEditor
{
public static readonly uint MaxDocuments;
static DocumentEditor()
{
MaxDocuments = DoSomethingToFindOutMaxNumber();
}
}
在本例中,字段是静态的,因为每次运行程序的实例时,只需存储最大文档数一次。这就是在静态构造函数中初始化它的原因。如果只读字段是一个实例字段,就要在实例构造函数中初始化它。
public class Document
{
public readonly DateTime CreationDate;
......
C# 静态构造函数(2009-11-24 17:15:00)
摘要:
参见 《C# 高级编程》第四版
· 编写静态构造函数的一个原因是,类有一些静态字段或属性,需要在第一次使用类之前,从外部源中初始化这些静态字段和属性。
· 静态构造函数至多运行一次,即在代码引用类之前执行。
· 静态构造函数没有访问修饰符,其他C#代码从来不调用它,所以像public和private这样的访问修饰符就没有意义了。
· 静态构造函数不能带任何参数,一个类也只能有一个静态构造函数。
· 静态构造函数只能访问类的静态成员,不能访问实例成员。
下面给出一个实例:
public class UserPreferences
{
public static readonly Color BackColor;
static UserPreferences()
{
//read BackColor from out source;
}
// ...
}
class MainEntryPoint
{
static void Main()
{
&nb......
C# Regular Expression(2009-11-04 18:03:00)
摘要:
http://www.radsoftware.com.au/articles/regexlearnsyntax.aspx
The basics - Finding text
Text: Anna Jones and a friend went to lunch
Regex: went
Matches: Anna Jones and a friend went to lunch
went
Matching any character with dot
Text: abc def ant cow
Regex: a..
Matches: abc def ant cow
abc
ant
Matching word characters
Text: abc anaconda ant cow apple
Regex: a\w\w
Matches: abc anaconda ant cow apple
abc
ana
ant
app
Backslash and an uppercase 'W' (\W) will match any non-word character.
Matching white-space
Text: "abc anaconda ant"
Regex: a\w\w\s
Matches:
"abc "
White-space is defined as the space character, new line (\n), form feed (\f), carriage return (\r), tab (\t) and vertical tab (\v). Be careful using \s as it can lead to unexpected behaviour by matching line breaks (\n and \r). Sometimes it is better to explicitly specify the characters to match instead of using \s. e.g. to match Ta......
