读书笔记(C#高级编程)

    技术2022-05-11  84

    一、string 、 转义字符(/) 、 @ string 同char一样可以包含Unicode、16进制数、转义序列。 因为这些转义序列以一个反斜杠开头,所以不能在字符串中使用这个非转义的反斜杠字符。而需要用两个反斜杠("//")表示它:          string filepath = "D://勉強のNote"; C#也提供了另一种替代方法,可以在字符串变量前面加上字符@,在这个字符后的所有字符都看作其原来的含义--他们不会被解释成转义字符:        string filepath = @"D:/勉強のNote"; 甚至允许在字符串变量中包含转行符:        string day = @"Today is                                         Monday!"; 那么day的值就是: Today is                                         Monday! 在两行之间有很多空格。 二、虽然结构是值类型,但是如果结构没有先使用new关键字进行初始化,编译器就不允许把结构复制到另一个结构上,也不允许在设置其字段值前读取它们。 三、字段(Field)与局域变量 在某些环境下,可以区分同名但范围不同的两个标示符。此时编译器允许生命第二个变量。原因是C#使得变量之间有一个基本的区分,它把声明为类级(class level)的变量看作是字段(Field),而把在方法中声明的变量看作是局域变量。运行时,局域变量会隐藏类级变量,要是想引用类级变量,可以使用object.fieldname,在对象的外部引用类的字段或结构。 class  SomeClass {    public int i = 20 ;} 则,要访问i字段: SomeClass sc  =   new  SomeClass(); int  x  =  sc.i ; 要是在一个静态方法里访问一个静态字段,不用类的实例,直接使用类名即可。 Console.WriteLine(ScopeTest.j); 如果要访问一个实例字段,用this关键字。this用于一个类或结构中,以获得对当前实例的引用。 四、c#中有五种访问级别private、internal、protected、internal protected和public【译注internal protected当然也可以是protected internal,此外再无其它组合】。 public可以被任意存取; protected只可以被本类和其继承子类存取; internal只可以被本组合体(Assembly)内所有的类存取,组合体是C#语言中类被组合后的逻辑单位和物理单位,其编译后的文件扩展名往往是“.DLL”或“.EXE”。 protected internal唯一的一种组合限制修饰符,它只可以被本组合体内所有的类和这些类的继承子类所存取。 private只可以被本类所存取。 如果不是嵌套的类,命名空间或编译单元内的类只有public和internal两种修饰。 new修饰符只能用于嵌套的类,表示对继承父类同名类型的隐藏。 abstract用来修饰抽象类,表示该类只能作为父类被用于继承,而不能进行对象实例化。抽象类可以包含抽象的成员,但这并非必须。abstract不能和new同时用。下面是抽象类用法的伪码: abstract class A { public abstract void F(); } abstract class B: A { public void G() {} } class C: B { public override void F() { //方法F的实现 } } 抽象类A内含一个抽象方法F(),它不能被实例化。类B继承自类A,其内包含了一个实例方法G(),但并没有实现抽象方法F(),所以仍然必须声明为抽象类。类C继承自类B,实现类抽象方法F(),于是可以进行对象实例化。 sealed用来修饰类为密封类,阻止该类被继承。同时对一个类作abstract和sealed的修饰是没有意义的,也是被禁止的。 五、 Customer MrJones = new Nevermore60Customer();         //Nevermore60Customer继承自Customer        实际上只是改变了变量的声明, 变量的实质还是  Nevermore60Customer , 类Nevermore60Customer 新添加的字段、方法、属性都无法使用。        但是, 如果两个类中都有方法,编译器如何确定应调用那个方法呢? 这要根据方法是否声明为virtual:        1、如果方法不是virtual,编译器就是用声明的使用类型,Customer。        2、如果方法是virtual,编译器就回生成代码,在运行时检查 引用 实际上指向哪个实例,然后确定实例属于哪个类,并调用 适当的重写方法。   ( 如果在子类中不是用override重写方法,而是用new(隐藏基类方法)的话,那么将通过类型转换调用到上一级父类的重写方法。)

    最新回复(0)