20151024_001_C#基础知识(静态与非静态的区别,值类型和引用类型,堆和栈的区别,字符串的不可变性,命名空间)

来源:互联网 发布:调度流程的优化的意义 编辑:程序博客网 时间:2024/05/21 05:43


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 初始化:

char[] chars = new char[4];chars[0] = 'X';        // Character literalchars[1] = '\x0058';   // Hexadecimalchars[2] = (char)88;   // Cast from integral typechars[3] = '\u0058';   // Unicodeforeach (char c in chars){    Console.Write(c + " ");}// Output: X X X Xchar

 

区别:

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类简直不是一个数量级的。

 

0 0