首页 > 代码库 > C#拾遗(一)

C#拾遗(一)

           声明

随意写的一些笔记,主要给自己看的,说的有些不严谨,有些表达比较简略,大概就这意思就行了。

内容

                                                                字符串,继承,三种参数修饰符,

1.访问类的字段用this

eg: this.name = name;      //后一个name是形参

2.字符串的常见操作

1   .Length   //字符串的长度属性,故无括号

2   byte []bystr = System,Text.Encoding.Default.GetBytes(str);

3    字符串截取    str.Substring(0,2);      //第一个是起始位置,第二个是截取位数

4   指定位置为空字符   

char.IsWhiteSpace(str,2);    同理还有 IsPuctuation等

5   str.Replace(str1,str2);     将str中的str1子串替换成str2

6.  strTrim();    清除空格

7.  Split的分割    

string []arr =str.Split(‘,‘);

string []arr = str.Split(new char[2]{‘a‘,‘b‘};

string []arr = Regex.Split(str, "js", Regex.Options.IgnoreCase);

8. 通过Tostring()选择字符串格式

.ToString("e")     科学计算

.ToString("x")    16进制

...

9   获取随机数

Random r = new Random();

然后不断的用.Next()获取随机数,很简单吧~~

r.Next(a,b)    //a~b的随机数

r.Next(10)和r.Next()%10是一样的

 

10 字符串与整数之间的转换

Int32.Parse(str);   //为null时会抛出异常

Int32.TryParse(str, out myint);  //返回true或false来说明解析是否成功,解析错误,则out调用方法得到零值。                                              Convert.ToInt32(str);  //在null时不抛出异常,返回零

                                                               继承

1.在子类中通过base.函数名 来调用基类函数成员

eg:   base.sayHello();

子类的实例可以通过显示类型转换,转换成父类的实例,进而调用父类的成员。

2.  子类的方法名与父类的方法名重名时,子类中需要用new来隐藏掉父类的成员方法。因为子类会从父类继承到public的方法成员,不用new覆盖的话,编译器会蒙圈的~~

3. 用sealed来密封类,防止被继承

4.抽象类 

基类并不具体实现任何执行代码,只是做个定义,具体实现在派生类中重写(override),另一种方法是不打类声明为抽象类,但基类里也不写具体实现,可以把基类的方法声明为虚函数(virtual)

方法一:

public abstract class A

{

public abstract void sayHello();   //不止类要写abstract,这里也要写(⊙o⊙)哦

}

public class B:A

{

public override void sayHello()

{  

Console.WriteLine("ww");

}

}

方法二:

去掉class A前的abstract,同时将void sayHello前的abstract 改成virtual。

由此可见,override的函数在基类中必须为abstrac或是virtual。

4.多重继承

C#不支持多重继承,但C#允许类派生于多个接口,只不过多个父类的class改成interface罢了。。。

但是对于子类接口实现,有两个条件

1.两个接口的同名方法的实现,必须带上接口名

如:void A.Common(){..};

void B.Common(){..}‘

2.两个接口的不同名称的方法,必须冠以"public"

如:public void A1();

public void B1();

eg:

interface A

{

void A1();

void Common();

}

interface B

{

void B1();

void Common();

}

class Child:A,B

{

public void A1(){..};

void A1.Common(){..};

public void B1(){..};

void B1.Common(){..};

}

具体实例化时:

Child chd = new Child();

((A)chd).Common();

((B).chd).Common();

chd.A1();

chd.B1();

 

分析:其实上面两个规则应该很好理解:

对于同名的,那肯定是要说明是谁的方法啊,否则子类哪知道呢~~,不带访问修饰符,那默认是private,好让子类只能得到两个接口的同名函数中的一个~~。    

对于不同名的,那必须为public啊,好让子类继承啊~~

一些小技巧

1.@的作用

1.使用在字符串前面,让"\"变成普通字符而非转义字符

eg:string filePath = @"C:\text\text1";

2.表示跨行字符串

string multiRows = @"Line1

Line2

Line3";    //蛮好的,省的一行字符串写太长不方便看

3.在系统保留的关键词面前加上,可以当做普通字符使用

2.using 略~~

参数修饰符

1.params

parms是用来修饰数组的,一个函数中最多只能有一个可变参数】

eg:public static void UseParams(params int []list)

{

...

}

传参时,可以UseParams(1,‘a‘,3)或是 int []array = new int[3]{1,2,3}; Useparams(array);

2. out 和ref

out和ref差不多,都是传引用。就如C++中的,普通传参,形参的改变不会影响到实参。如果是指针或引用做为参数的话,就会形参的改变影响到实参。而

out和ref就是引用,用法有些许不同罢了。

区别:

1.out的实参不需要初始化,初始化也没用,传参是初始化的实参会被清空,只剩下地址,没有数据,并且在函数结束之前必须赋值!

而ref的一定要初始化。

2.其实out一般用来获得方法的多个返回值,这里的返回值并不是return .., 而是,比如  

static void Split(String name, out string firstnames, out string lastname)

{

int i = name.LastIndexOf(‘ ‘);

firstNames = name,Substring(0,i);   //第一个返回值

lastName = name.Substring(i+1);       //第二个返回值

}

3.ref一般是用来获得函数的一个返回值。并且一定要初始化。

注意点:

1.定义和调用时都要写out/ref

2.二者都能和普通传参构成重载,但相互之间不能构成重载(想想也差不多是这么回事吧~~)

                           

 

C#拾遗(一)