争怎路由网:是一个主要分享无线路由器安装设置经验的网站,汇总WiFi常见问题的解决方法。

The C# Programming Language Notes

时间:2024/7/16作者:未知来源:争怎路由网人气:

(Test lhs, Test rhs){
return lhs;
}
static void Main(string[] args)
{
if(new Test() && new Test()){
}
}
}

10,作用域

与Java有点不一样,嵌套块中名称相同的标识符都必须引用相同的实体,这项规则保证一个表达式上下文中名称的意义在一个块中是相同的:
class Test
{
double x;
void F(bool b) {
x = 1.0;
if (b) {
int x = 1;
}
}
}
是错误的,因为x在外部块中(在if语句中包含嵌套块的扩展)引用了不同的实体。相反,例子
class Test
{
double x;
void F(bool b) {
if (b) {
x = 1.0;
}else {
int x = 1;
}
}
}
是允许的,因为名称x在外部块中永远不会使用

11,离开finally

与Java一样,finally中抛出异常,原先的异常(假如有的话)将被终止;不一样的是,不允许使用return,goto等离开finally,不知为什么

12,子包与外围包

与Java不一样,子包居然能访问外围包,不用using,方便,但合理否?

13,属性权限

get/set好像不能设置不同的权限,比如,我想internal set,而public get,不知怎么弄

14,序列化

当绝大部分域可以使用默认序列化,少数需要特殊处理时,将那少数几个域做成internal独立对象,令其自定义序列化,然后原对象中包含这个独立对象

15,int[][]是一维数组

int[,]才是二维的,矩阵
int[][]实际是锯齿

int[][] one = new int[7][];
int[,] two = new int[3,2];

维指示符在最后的非数组元素前被从左到右读。例如类型int[][,,][,]是一个int类型的两维数组的三维数组的单维数组

数组调用很明确的不会扩展到数值类型的数组,例如,不存在可以允许把int[]看作object[]的转换

数组初始化程序必须有与数组维数一样的嵌套级别。最外层嵌套与最左边的维数对应,而最里层的嵌套与最右边的维数对应

16,new virtual有没有意义?

class A
{
public virtual void F() { Console.WriteLine("A.F"); }
}
class B: A
{
public override void F() { Console.WriteLine("B.F"); }
}
class C: B
{
new public virtual void F() { Console.WriteLine("C.F"); }
}
class D: C
{
public override void F() { Console.WriteLine("D.F"); }
}
class Test
{
static void Main() {
D d = new D();
A a = d;
B b = d;
C c = d;
a.F();
b.F();
c.F();
d.F();
}
}
类C和D包含两个有相同签名的虚拟方法:一个被A引入而一个被C引入。被C引入的方法隐藏了从A继承的方法。这样,D中的覆盖声明覆盖了被C引入的方法,而D覆盖被A引入的方法是不可能的。例子产生下面的输出:
B.F
B.F
D.F
D.F

什么情况下,什么理由,我们需要new virtual?

17,override时无法改变访问修饰

即使是放宽

18,x+=y 结果有可能是void

“在一个形式为x += y 或 x -= y的操作中,当x是一个事件成员而引用在x所在的类型外面发生时,操作的结果就是void;这个规则禁止外部代码直接检查事件成员” ???

19,构造函数执行顺序

可以把一个实例变量初始化函数和一个构造函数初始化函数,看作是自动插在构造函数主体中的第一条语句前。例子
class A
{
int x = 1, y = -1, count;
public A() {
count = 0;
}
public A(int n) {
count = n;
}
}
class B: A
{
double sqrt2 = Math.Sqrt(2.0);
ArrayList items = new ArrayList(100);
int max;
public B(): this(100) {
items.Add("default");
}
public B(int n): base(n – 1) {
max = n;
}
}
包含了许多变量初始化函数,并且也包含了每个形式(base和this)的构造函数初始化函数。这个例子与下面介绍的例子相关,在那里,每条

注释指明了一个自动插入的语句(自动插入构造函数调用所使用的语法不是有效的,至少用来演示这个机制)。
class A
{
int x, y, count;
public A() {
x = 1; // Variable initializer
y = -1; // Variable initializer
object(); // Invoke object() constructor
count = 0;
}
public A(int n) {
x = 1; // Variable initializer
y = -1; // Variable initializer
object(); // Invoke object() constructor
count = n;
}
}
class B: A
{
double sqrt2;
ArrayList items;
int max;
public B(): this(100) {
B(100); // Invoke B(int) constructor
items.Add("default");
}
public B(int n): base(n – 1) {
sqrt2 = Math.Sqrt(2.0); // Variable initializer
items = new ArrayList(100); // Variable initializer
A(n – 1); // Invoke A(int) constructor
max = n;
}
}
注意变量初始化函数被转换为赋值语句,并且那个赋值语句在对基类构造函数调用前执行。这个顺序确保了所有实例域在任何访问实例的语句

执行前,被它们的变量初始化函数初始化。例如:
class A
{
public A() {
PrintFields();
}
public virtual void PrintFields() {}
}
class B: A
{
int x = 1;
int y;
public B() {
y = -1;
}
public override void PrintFields() {
Console.WriteLine("x = {0}, y = {1}", x, y);
}
}
当new B() 被用来创建B的实例时,产生下面的输出:
x = 1, y = 0
因为变量初始化函数在基类构造函数被调用前执行,所以x的数值是1。可是,y的数值是0(int的默认数值),这是因为对y的赋值直到基类构造函数返回才被执行。

静态构造函数自动被调用,不能被显式调用。虽然提供了许多约束条件,但是静态构造函数执行的确切时间和顺序是不确定的:
一个类的静态构造函数在这个类的任何实例被创建前执行。
一个类的静态构造函数在类的任何静态成员被引用前执行。
一个类的静态构造函数在它的所有派生类的静态构造函数执行之后执行。
一个类的静态构造函数从不会被执行一次以上。

20,struct可以实现接口

稍有意外,看来struct基本类似于“对基本数据类型域有深拷贝语义的sealed类”,说完这句话都觉得别扭

21,接口

与Java不一样,接口不能声明静态常量和内部类,接口的成员必须是方法、属性、事件或索引

22,枚举

不明白为什么非得跟整型扯上点关系,为了&

关键词:The C# Programming Language Notes




Copyright © 2012-2018 争怎路由网(http://www.zhengzen.com) .All Rights Reserved 网站地图 友情链接

免责声明:本站资源均来自互联网收集 如有侵犯到您利益的地方请及时联系管理删除,敬请见谅!

QQ:1006262270   邮箱:kfyvi376850063@126.com   手机版