C#学习笔记(四)
1、命名空间
主要用来解决类重名问题。
如何在一个项目中引用另一个项目中的类
1)、在VS解决方案栏中项目下的引用右键添加引用;
2)、在要引用其他类的CS文件中使用using引用其命名空间;
2、值类型和引用类型
区别:
1)、值类型和引用类型在内存上存储的地方不一样;
2)、在传递值类型和传递引用类型的时候,传递的方式不一样,值类型的传递称为值传递,引用类型的传递称为引用传递。
值类型:int、double、bool、char、decimal、struct、enum。
引用类型:string、数组、自定义类。
值类型存储在内存的栈中。
引用类型存储在内存的堆中。
3、字符串的不可变性
1)、当给一个字符串重新赋值之后,老值并没有销毁,而是重新再内存中开辟一块空间用来存储新的值。因此每次对字符串进行操作都会产生一块垃圾内存,为了解决这个问题就可以利用StringBuilder,当对字符串进行重复操作时,StringBuilder不会开辟新的内存,而只是操作同一块内存。
StringBuilder sb=new StringBuilder();
string str=null;
for(int i=0;i<1000000;i++)
{
//str+=i; //直接对str进行操作效率很低
sb.Append(i);//利用StringBuilder会快很多
}
//最终还是要把StringBuilder转换成string
str=sb.ToString();
2)、可以将string看做char类型的只读数组,因此可以通过下标访问字符串中的某一个元素。
string s="abcdefg";
//s[0]就表示的a,只能读取,不能对s[0]=b进行赋值
//ToCharArray将string转换成char[]
char[] chs=s.ToCharArray();
chs[0]=b;
//再将字符数组转换成string
s=new string(chs);
3)、字符串的方法
- Length:属性,得到字符串的长度
- ToUpper():将字符串转换为大写
- ToLower();将字符串转换为小写
- Equals();比较两个字符串,通过参数可以选择不区分大小写
- split():分割字符串
string s="a b c - - , , . . * e + g =f";
char[] chs={' ','-',',','.','*','+','='};
string[] str=s.split(chs,StringSplitOptions.RemoveEmptyEntries);
把字符串中chs[]中的字符全部去掉
- Replace():字符转换
string s="你是中国人";
if(s.Contains("中国"))
{
s=s.Replace("中国","**");
}
把字符串中的中国用**替换
- SubString():截取字符串
string s="abcdefg";
string s1=s.SubString(1);
string s2=s.SubString(1,2);
- Startwith():判断字符串是以什么开头,返回的是布尔值
string s="abcdefg";
bool b=s.Startwith("ab");
//此时的b是TRUE
- Endwith():同上相反的意思
- Indexof():返回int,字符串中字符出现的位置
- LastIndexof();字符串中字符最后出现的位置
- Trim();移除字符串前后的空字符
- TrimEnd()和TrimStart():只移除前面或后面的空字符
- IsNullOrEmpty():判断字符串是否为Null或为空
- Join();用特定符号分割数组或元素
string[] names={"张三","李四","王五","赵六"};
string str=string.Join("|",names);
//或者
string str=string.Join("|","张三","李四","王五","赵六");
和上面一样的效果,因为Join的第二个参数是params可变参数
4、C#中计算程序运行时间
StopWatch sw=new StopWatch();
sw.Start();//开始计时
.....
sw.Stop();//停止计时
console.writeline(sw.Elapsed);//输出总时间
5、类的继承
类的继承两个特性
1)、单根性:C#只支持单继承,不支持多继承,一次只能继承一个类
2)、传递性:父类的父类的成员会一直传递到子类,并且会沿着继承的路线一直传递下去。
任何类都可以从另一个类那里继承,自定义的类没有写继承,默认的都是继承自Object类,Object类是所有类的基类。
继承的时候,父类的public以及protected成员可以被子类访问,但是父类的private成员不能被子类访问。
父类的成员可以是虚拟的,成员由派生类重写,父类本身也可以是抽象类,抽象类不能直接实例化,而必须由派生类来实例化。
注:子类没有继承父类的构造函数,但是子类会默认调用父类的无参构造函数用来创建父类的对此昂,所以如果在父类中重新写了一个有参数的构造函数,这个时候无参构造函数就会去覆盖,解决办法:
1)、在父类中重新写一个无参数的构造函数;
2)、在子类中显示地调用父类的构造函数,用关键字——:base(父类有参构造函数的参数);
6、关键字的new隐藏父类成员
如果在子类中有和父类命名一样的方法,则子类会覆盖父类的方法,有时候我们需要显示地表示要把父类的某个方法隐藏,这个时候可以使用关键字new,直接在父类方法的返回值前面加上关键字new即可。