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


    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
    char

    区别:

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

    code write the life, programe change the world
  • 相关阅读:
    站立会议01---个人总结
    团队项目的NABCD
    查找水王
    《构建之法》读书笔记03
    《构建之法》读书笔记02
    《构建之法》读书笔记01
    Java web应用开发技术
    Java 模拟ATM(修正)
    Java 多态
    Java 接口与继承 道至简第六章发表阅读笔记
  • 原文地址:https://www.cnblogs.com/DrHao/p/4897472.html
Copyright © 2020-2023  润新知