一、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(隐藏基类方法)的话,那么将通过类型转换调用到上一级父类的重写方法。)
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,在对象的外部引用类的字段或结构。




则,要访问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(隐藏基类方法)的话,那么将通过类型转换调用到上一级父类的重写方法。)