命名空间
namespace
解决类的重名问题。可以看做的是类的“文件夹”。
如果命名空间缺失,可以选中类,用快捷键 alt+shift+F10,可以导入命名空间。
在一个项目中引用另一个项目的类
- 添加引用
- 引用命名空间
值类型与引用类型
区别
- 值类型与引用类型在内存上存储的地方不一样
- 传递方式不一样。值类型我们称之为值传递,引用类型我们称之为引用传递。
值类型:int,double,bool,char,decimal,struct,enum
引用类型:string,自定义类,数组 - 存储:值类型的值是存储在内存的栈中,引用类型是存储在堆中。
字符串
字符串的不可变性
当程序结束的时候,GC扫描整个内存,只要发现某块区域没有任何指向,这块区域会被释放掉。我们可以将字符串看做是char类型的一个只读数组。不能被重新赋值。
stringbuilder
相比于string,对stringbuilder操作的时候,并不会一直新建内存,所以涉及到字符串改变的时候,可以用stringbuilder。
StringBuilder sb = new StringBuilder();
string str = null;
//创建了一个计时器,用来记录
Stopwatch sw = new Stopwatch();
sw.Start();
for (int i = 0; i < 100000; i++)
{
sb.Append(i);
}
sw.Stop();
Console.WriteLine(sw.Elapsed);
Console.ReadKey();
字符串的一些方法
- Length:获得当前字符串中字符的个数;
- ToUpper():将字符串转换成大写类型;
- ToLower():将字符串转换成小写类型;
- Equals():比较两个字符串;
- Split():分割字符串,返货字符串类型的数组;
- substring():截取字符串。在截取的时候包含要截取的那个位置;
- Indexof():判断某个字符串在字符串中第一个出现的位置,如果没有返回-1,
- LastIndexof():判断某个字符串在字符串中最后一次出现的位置;
- startwith():判断以……开始;
- endwith():判断以……结束;
- Replace():将字符串中某个字符串替换成一个新的字符串;
- contains():判断某个字符串是否包含指定的字符串
- trim():去掉字符串中前后的空格
- trimend():去掉字符串中结尾的空格
- trimstart():去掉字符串中前面的空格
- string.isNullorempty():判断一个字符串是否为空或者为Null
- string.join():将数组按照指定的字符串连接,返回一个字符串
- new string(char[] chs)
如何将字符数组转换成字符串?
用string.join()的方法;
//接收用户输入的字符串,将其中的字符以与其输入相反的顺序输出。例如“abc"->"cba"
Console.WriteLine("请输入字符串:");
string str = Console.ReadLine();
char[] c = str.ToArray();
c = c.Reverse().ToArray();
str = string.Join("", c);
Console.WriteLine(str);
Console.ReadKey();·
如何读取一行一行读取文本文档?
//文本文件中存储了多个文章标题、作者,标题和作者之间,用若干空格(数量不定)隔开,每行一个,标题有的长,有的短
//输出到控制台的时候最多标题长度10,如果超过10,则截取长度9的字符串并且最后添加“……”,加一个竖线后输出作者名字
int counter = 0;
string line;
//read the file and display it line by line
System.IO.StreamReader file = new System.IO.StreamReader(@"C:\Users\lones\Desktop\C#Practise\第10天 继承\书名与作者.txt", Encoding.Default);
string[] str = new string[2];
int index;
while ((line = file.ReadLine()) != null)
{
str = line.Split(' ');
str[0] = str[0].Replace('《', ' ').Trim();
str[0] = str[0].Replace('》', ' ').Trim();
str[0]=str[0].Length > 10 ? str[0].Substring(0, 8) + "……" : str[0];
Console.WriteLine(string.Join("|", str));
counter++;
}
file.Close();
Console.WriteLine("There are {0} lines.", counter);
//suspend the screen
Console.ReadLine();
继承
我们可能会在一些类中,写一些重复的成员,我们可以将这些重复的成员单独地封装到一个父类(基类),其他类作为这个类的子类(派生类)。
子类继承了父类,子类从父类中继承了什么?
首先:继承了父类的属性和方法,但是没有继承父类的私有字段;
子类并不继承父类的构造函数。但是子类会默认调用父类无参数的构造函数,创建父类对象,让子类可以使用父类中的成员。
如果在父类中重写一个有参数的构造函数之后,无参数的构造函数就被干掉了。子类调用不了。
解决办法:
- 在父类中重写一个无参数的构造函数
- 在子类中显示的调用父类的构造函数,也是我们比较常用的。用关键词base
public class Person
{
private string _name;
public string Name
{
get { return _name; }
set { _name = value; }
}
private int _age;
public int Age
{
get { return _age; }
set { _age = value; }
}
private char _gender;
public char Gender
{
get { return _gender; }
set { _gender = value; }
}
public Person(string name,int age,char gender)
{
this.Name = name;
this.Age = age;
this.Gender = gender;
}
public void CHLSS()
{
Console.WriteLine("我是人,我会吃喝拉撒睡");
}
}
//如何继承构造函数?
public class Student : Person
{
private int _id;
public int ID
{
get { return _id; }
set { _id = value; }
}
public Student(string name,int age,char gender,int id):base(name,age,gender)
{
this.ID = id;
}
继承的特性
- 继承的单根性
- 继承的传递性
new 关键字
- 创建对象
- 隐藏从父类那里继承过来的同名成员,隐藏的后果就是调用不到父类的成员
里氏转换
- 子类可以赋值给父类
- 如果父类中装的是子类对象,那么父类可以强转成子类
- is: 表示类型转换,如果转换成功,返回true,如果转换失败,返回false
Person p = new Student();
if(p is Teacher)
{
Student s = (Student)(p);
s.StudentSayHello();
}
else
{
Console.WriteLine("转换不成功!");
}
Console.ReadKey();
- as:表示类型转换,如果能转换成功,则返回那个对象,如果不能转换,则返回Null;
访问修饰符protected
Arraylist 与 Hashtable
Var-推断类型
C#:强类型语言,在代码中对每个变量的类型必须要有一个明确的定义;
var:根据值可以推断类型。问题是:隐式变量必须初始化。用的时候必须赋值。
- 装箱:
- 开箱:
Path 类
File类
File类的基本方法
编码
将字符串以怎样的形式保存在二进制
乱码产生的原因,保存这个文件所用的编码与打开这个文件采用的编码方式不一样。
- ASC 128
- ASCII 256
- GB2312 简体字
- Big5 繁体字
- UNICODE 解析起来慢
- UTF-8 web