1:我们把这些具有相同属性和相同方法的对象进行进一步的封装,抽象出来类这个概念。
类就是个模子,确定了对象应该具有的属性和方法。
对象是根据类创建出来的。
2:类:语法
[public] class 类名
{
字段;
属性;
方法;
}
写好了一个类之后,我们需要创建这个类的对象,那么,我们管创建这个类的对象过程称之为类的实例化。使用关键字new
实例化类===创建类
this:表示当前这个类的对象。
类是不占内存的,而对象是占用内存的。
结构是面向过程的,类是面向对象的,之前没有面向对象的时候,都是使用结构
3:属性
属性的作用就是保护字段,对字段的赋值和取值进行限定。
属性的本质就是两个方法,一个叫get(),一个叫set()
Field字段,Method方法,Property属性
4:属性:get中判断字段的值,set中判断value的值
字段在类中必须是私有的private
属性在类中必须是公有的public
属性本质就是get_value和set_value两个方法组成
既有get()也有set(),称之为可读可写属性
只有get(),称之为只读属性
只有set(),称之为只写属性
类中的字段不加访问修饰符,默认是private
5:当我们创建好一个类的对象后,需要给这个对象的每个属性去赋值,我们管这个过程称之为对象的初始化
6:静态与非静态的区别
1):在非静态类中,既可以有实例成员,也可以有非静态成员。
2):在调用实例成员的时候,需要使用 对象名.实例成员;
在调用静态成员的时候,需要使用 类名.静态成员名;
总结:静态成员必须使用类名去调用,而实例成员使用对象名调用。
静态函数中只能访问静态成员,不允许访问实例成员。
实例方法中既可以使用静态成员,也可以使用实例成员。
静态类中只允许有静态成员,不允许出现实例成员。
使用:
1):如果你想要你的类当做一个"工具类"去使用,这个时候可以考虑将类写成静态类。
2):静态类在整个项目中资源共享。
只有在程序全部结束之后,静态类才会释放资源
GC: Garbage Collection 垃圾回收器
7:构造函数
作用:帮助我们初始化对象(给对象的每个属性依次赋值)
1):构造函数没有返回值,连void也不用写
2):构造函数的名称必须跟类名一样。
创建对象的时候会执行构造函数,构造函数是可以有重载的。
类中会有一个默认的无参数的构造函数,当你写一个新的构造函数之后,不管是不是无参数的,那个默认的无参数的构造函数都被干掉了。
8:new关键字
Person zsPerson = new Person();
new帮助我们做了3件事:
1):在内存中开辟一块空间
2):在开辟的空间中创建对象
3):调用对象的构造函数进行初始化对象
9:析构函数
当程序结束的时候,析构函数才执行,帮助我们释放资源
不能在结构中定义析构函数。只能对类使用析构函数。
一个类只能有一个析构函数。
无法继承或重载析构函数。
无法调用析构函数。它们是被自动调用的。
析构函数既没有修饰符,也没有参数。
10:命名空间
可以解决类命名冲突问题,可以认为类是属于命名空间的("类的文件夹")。
如果代码和被使用的类在一个namespace则不需要using。
如果在当前项目中没有这个类的命名空间,需要我们手动的导入这个类所在的命名空间
1):用鼠标去点
2):Shift+Alt+F10 (Ctrl+".") (推荐)
3):记住命名空间,手动去引用
在不同命名空间下的类调用有两种方法:
1:写全称 命名空间.类名, 2:先using引用命名空间,再调用
using关键字有什么用?什么是IDisposable?
using可以声明namespace的引入,还可以实现非托管资源的释放,实现了IDisposiable的类在using中创建,using结束后会自动调用该对象的Dispose方法,释放资源。
using其实等价于try……finally,用起来更方便。
11:在一个项目中引用另外一个项目的类
1):添加引用
2):引用命名空间
12:值类型和引用类型
1:值类型和引用类型在内存上存储的地方不一样
2:在传递值类型和传递引用类型的时候,传递的方式不一样。
值类型我们称之为值传递,引用类型我们称之为引用传递。
值类型:整型:int , 长整型:long , 浮点型:float , double , 布尔型:bool , 字符型:char , 小数类型:decimal , 结构:struct , 枚举:enum
引用类型:基类:System.Object , 字符串:string , 自定义类:class , 接口:interface , 数组:int[],string[]
int (-2,147,483,648 到 2,147,483,647) (有符号 32 位整数)
long (-9,223,372,036,854,775,808 到 9,223,372,036,854,775,807) (有符号 64 位整数)
float (-3.4 × 1038 到 +3.4 × 1038) (7 位)
double (±5.0 × 10−324 到 ±1.7 × 10308) (15 到 16 位)
char (U+0000 到 U+FFFF) (16 位 Unicode 字符)
decimal ((-7.9 x 1028 - 7.9 x 1028) / (100 - 28)) (28-29 个有效位)
如果希望整数被视为 float, 应使用后缀 f 或 F 初始化浮点型变量 , float x = 3.5F;
如果希望整数被视为 double,请使用后缀 d 或 D , double x = 3D;
如果希望实数被视为 decimal 类型,请使用后缀 m 或 M , decimal myMoney = 300.5m;
char类型的常数可以写成字符、十六进制换码序列或 Unicode 表示形式。
您也可以显式转换整数字符代码。 在下面的示例中,四个 char 变量使用同一字符 X 初始化:
1 char[] chars = new char[4]; 2 3 chars[0] = 'X'; // Character literal 4 chars[1] = 'x0058'; // Hexadecimal 5 chars[2] = (char)88; // Cast from integral type 6 chars[3] = 'u0058'; // Unicode 7 8 foreach (char c in chars) 9 { 10 Console.Write(c + " "); 11 } 12 // Output: X X X X
区别:
1:将一个值类型变量赋给另一个值类型变量时,将复制包含的值。引用类型变量的赋值只复制对对象的引用,而不复制对象本身。
2:值类型不可能派生出新的类型:所有的值类型均隐式派生自System.ValueType。但与引用类型相同的是,结构也可以实现接口。
3:值类型不可能包含null值:
4:每种值类型均有一个隐式的默认构造函数来初始化该类型的默认值。
存储:
值类型的值是存储在内存的栈当中。
引用类型的值是存储在内存的堆中。
堆和栈的区别:
栈是编译期间就分配好的内存空间, 隐藏你的代码中必须就有栈的大小明确定义; 局部值类型变量/值类型参数等都在栈内存中。
堆是程序运行期间动态分配的内存空间,你可以根据程序的运行情况确定要分配的堆内存的大小。
13:字符串的不可变性
13.1: 当你给一个字符串重新赋值之后,老值并没有销毁,而是重新开辟一块空间存储,
当程序结束后,GC扫描整个内存,如果发现有的空间没有被指向,则立即把它销毁。
13.2: 我们可以将字符串看做是char类型的一个只读数组。
字符串转换为字符数组:char[] charArr=s.ToCharArray();
字符数组转换为字符串:s=new string(charArr);
13.3: Stopwatch 用于监控程序执行时间,
sw.Start();
sw.Stop();
sw.Elapsed();//测试运行时间
13.4: 字符串提供的各种方法
1):Length:获得当前字符串中字符的个数
2):ToUpper():将字符转换成大写形式
3):ToLower():将字符串转换成小写形式
4):Equals(string,StringComparison.OrdinalIgnoreCase):比较两个字符串,可以忽略大小写
s.Split(chs,StringSplitOptions.RemoveEmptyEntries)
5):Split():分割字符串,返回字符串类型的数组。
6):Substring():截取字符串。在截取的时候包含要截取的那个位置
7):IndexOf():判断某个字符串在字符串中第一次出现的位置,如果没有返回-1
8):LastIndexOf():判断某个字符串在字符串中最后一次出现的位置,如果没有,同上。
9):StartsWith():判断以...开始
10):EndsWith():判断以...结束
11):Replace():将字符串中某个字符串替换成一个新的字符串
12):Contains():判断某个字符串是否包含指定的字符串
13):Trim():去掉字符串中前后的空格
14):TrimEnd():去掉字符串中结束的空格
15):TrimStart():去掉字符串中前面的空格
16):string.IsNullOrEmpty():判断一个字符串是否为空或者为null
17):string.Join():将数组按照指定的字符串连接,返回一个字符串。
Ps:面试题:string str = null 与 string str = “”说明其中的区别。
答:string str = null 是不给他分配内存空间,而string str = "" 给它分配长度为空字符串的内存空间。 string str = null没有string对象,string str = ""有一个字符串对象。
Ps:面试题:StringBuilder 和 String 的区别?(*)
答:String 在进行运算时(如赋值、拼接等)会产生一个新的实例,而 StringBuilder 则不会。所以在大量字符串拼接或频繁对某一字符串进行操作时最好使用 StringBuilder,不要使用 String。
如果要操作一个不断增长的字符串,尽量不用String类,改用StringBuilder类。
两个类的工作原理不同:String类是一种传统的修改字符串的方式,它确实可以完成把一个字符串添加到另一个字符串上的工作没错,但是在.NET框架下,这个操作实在是划不来。
因为系统先是把两个字符串写入内存,接着删除原来的String对象,然后创建一个String对象,并读取内存中的数据赋给该对象。这一来二去的,耗了不少时间。
而使用System.Text命名空间下面的StringBuilder类就不是这样了,它提供的Append方法,能够在已有对象的原地进行字符串的修改,简单而且直接。
当然,一般情况下觉察不到这二者效率的差异,但如果你要对某个字符串进行大量的添加操作,那么StringBuilder类所耗费的时间和String类简直不是一个数量级的。