- 对面向对象基础概念的一些总结,以后有空会写一个面向对象基础的文章。
(1)Person LaoLi=new Person(); //这里的new开辟了内存空间,创建了对象,同时还调用了构造函数。
(2)构造函数:
public Student(string name,int age,char gender)
{
this.Name=name;
this.Age=age;
this.Gender=gender;
}
public Student(string name,char gender):this(name,0,gender)
{
}
(3)值类型和引用类型,在内存上存储地方不一样。
值类型:int,double,decimal,struct,enum; 存储在栈
引用类型:string,自定义class,数组 存储在堆,同时栈中也会有存一个堆的地址。
(4)字符串的不可变性
给一个字符串赋值了,不是不可以不改变值,而是改变值以后,在堆中开辟新的空间去存值,栈中存的地址也会改变。
GC(garbage collection)会将没有指向的堆,回收。
于是,大量字符串的操作就要用到stringbuilder
StringBuilder sb=new StringBuilder();
string str=null;
Stopwatch sw=new Stopwatch();
sw.Start();
for(int i=0;i<1000;i++)
{
str+=i; //很慢,因为要一直开空间
sb.Append(i); //很快,因为一直用的同一个内存,Append就是往这里面增加数
}
sw.Stop();
string a=sb.ToString();//最后使用转化为字符串
Console.WriteLine(sw.Elapsed);
(5)字符串常用方法
.ToUpper();//大写
.ToLower();//小写
stri1.Equals(str2,StringComparison.OrdinalIgnoreCase)//忽略大小写比较
(6)去除字符串中无意义字符
string s="a b c + , d";
char[] c={' ','+',','};
string[] str=s.Split(c,StringSplitOptions.RemoveEmptyEntries);//不写后面的一串,就是将无意义字符变为空,但是还是占了位置
string[] str=s.Split(new char[]{' ','+',','},StringSplitOptions.RemoveEmptyEntries);
(7)字符串转char类型数组
char[] c=str.ToCharArray();
2.继承
(1)Person是父类,Stuent是子类。
Person如果写了构造函数,会覆盖空的构造函数。这个时候要么,给Person再写一个空的构造函数,要么用下面的语法继承
public Student(string name,int age,char gender,int id)
:base(name,age,gender)
{
this.Id=id;
}
(2)Person是父类,Stuent是子类。
都有一个SayHello的方法,子类是调用不到父类的这个重名方法的。
public void SayHello();
如果要在子类故意隐藏父类这个方法,使用 new: public new void SayHello();