C#学习笔记(四)

6 篇文章 1 订阅
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即可。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值