《C#入门经典(第9版)》的原文摘录
-
如果字符串中没有其他字符,就会检测以下字符串: (查看原文)
-
Providing there aren’t any other characters in the string, this will result in the detection of string such as (查看原文)
-
抽象类主要用作对象系列的基类,共享某些主要特性,例如共同的目的和结构。接口则主要用于类,这些类存在根本性区别,但仍然可以完成某些相同的任务。 (查看原文)
-
也可以由类显式地实现接口成员。如果这么做,就只能通过接口来访问该成员,不能通过类来访问。上一节的代码中使用的隐式成员可以通过类和接口来访问。
例如,如果类 MyClass 隐式地实现接口 IMyInterface 的方法 DoSomething(),如上所述,则下面的代码就是有效的:
MyClass myObj = new MyClass();
myObj.DoSomething();
下面的代码也是有效的:
MyClass myObj = new MyClass();
IMyInterface myInt = myObj;
myInt.DoSomething();
另外,如果 MyDerviedClass 显式地实现 DoSomething(),就只能使用后一种技术。 (查看原文)
-
...两个双引号之间的所有字符都包括在字符串中,包括行末字符和需要转义的字符。唯一例外是双引号字符的转义,他们必须制定,以免结束字符串。为此,可以再该字符串之前加上一个@字符
例:
@“Verbatim string literal.”
可以采用一般方式指定这个字符串,但需要使用下面这种方法
例:
@“A short list:
item 1
item 2”
逐字指定的字符串在文件名中非常有用,因为文件名中大量使用了反斜杠字符。如果使用一般的字符串,就必须在字符串中使用两个反斜杠
例:
“C:\\Temp\\MyDir\\MyFile.doc”
而有了逐字指定的字符串字面值,这段代码就更便于阅读。下面的字符串与上面等价
例:
@“C:\Temp\MyDir\MyFile.doc” (查看原文)
-
...名称空间(其实就是命名空间啦),他们是.NET中提供应用程序代码容器的方式,这样就可以唯一地表示代码及其内容。 (查看原文)
-
名称空间也作用.NET Framework中各项分类的一种方式。大多数项都是类型定义,就好像简单类型System.Int32等。 (查看原文)
-
默认情况下,C#代码包含在全局名称空间中。这意味着包含在这段代码中的项,只要按照名称进行引用,就可以由全局名称空间中的其他代码访问他们。 (查看原文)
-
可以使用namespace关键字为花括号中的代码块显示定义名称空间。 (查看原文)
-
如果在该名称空间代码的外部使用名称空间中的名称,就必须写出该名称空间中的限定名称。
限定名称包括它所有的分层信息,这基本上意味着,如果一个名称空间中的代码需要使用在另一个名称空间中定义的名称,就必须包括对该名称空间的引用。限定名称在不同的命名空间级别之间使用句点字符“.”
例: (查看原文)
-
这段代码定义了一个名称空间LevelOne,以及该名称空间中的一个名称NameOne(注意这里没有列出其他代码,是为了使我们的讨论更具普遍性,并在定义名称空间的地方添加了一个注释)。在名称空间LevelOne中编写的代码可以使用NameOne来引用该名称,不需要任何分类信息,但全局名称空间中的代码必须使用分类名称LevelOne.NameOne来引用这个名称。
在名称空间中,使用关键字namespace还可以定义嵌套的名称空间。嵌套的名称空间通过其层次结构来引用,并使用据点区分层次结构的层次。这最好通过一个示例来加以说明。考虑下面的名称空间
例: (查看原文)
-
在全局名称空间中,NameTwo必须引用为LevelOne.LevelTwo.NameTwo;在LevelOne名称空间中,可以引用为LevelTwo.NameTwo;在LevelOne.LevelTwo名称空间中,可以引用为NameTwo。 (查看原文)
-
非常重要的一点是,名称是由名称空间唯一定义的。可以再LevelOne和LevelTwo名称空间中定义名称NameThree: (查看原文)
-
这里定义了两个不同的名称 LevelOne.NameThree和LevelOne.LevelTwo.NameThree,可以的独立使用它们,互不干扰。 (查看原文)
-
创建了名称空间后,即可使用using语句简化对它们所含名称的访问。实际上,using语句的意思是”我们需要这个名称空间中的名称,所以不要每次总是要求对它们的分类“。例如,在下面的代码中,LevelOne名称空间中的代码可以访问LevelOne.LevelTwo名称空间中的名称,而无需分类: (查看原文)
-
LevelOne命名空间中的代码现在可以直接使用NameTwo引用LevelTwo.NameTwo。 (查看原文)
-
这里要用到两个关键字checked和unchecked,称为表达式的溢出检查上下文(反正这句话撸主是读不通) (查看原文)
-
使用(break when)Thrown时,即使是对于已处理的异常,也会进入调试器。 (查看原文)
-
前面说过,如果实现带属性的接口,就必须实现匹配的get/set存取器。这并不是绝对正确的——如果在定义属性的接口中只包含set块,就可给类中的属性添加get块,反之亦然。但只有隐式实现接口时才能这么做。另外,大多数时候,都想让所添加的存取器的可访问修饰符比接口中定义的存取器的可访问修饰符更严格。因为按照定义,接口定义的存取器是公共的,也就是说,只能添加非公共的存取器。 (查看原文)
-
需要注意特别重要的一点:using 语句本身不能访问另一个名称空间中的名称。除非名称空间中的代码以某种方式链接到项目上,或者代码是在该项目的源文件中定义的,或者是在链接到该项目的其他代码中定义的,否则就不能访问其中包含的名称。另外,如果包含名称空间的代码链接到项目上,那么无论是否使用 using,都可以访问其中包含的名称。using 语句便于我们访问这些名称,减少代码量,以及提高可读性。 (查看原文)