首页 > 代码库 > 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#拾遗(一)