关于《C#入门经典》的读后总结

来源:互联网 发布:淘宝处罚考试虚假交易 编辑:程序博客网 时间:2024/05/18 01:23

读后总结以及知识点的通俗化解释,还有自己容易忽略的部分的记录

①在大多数情况下,编译器会检查是否执行到  return  语句, 如果没有,就会提示 :“并不是所有的路径都有一个返回值”。意思就是你这没有找到返回值,你的写法可能是正确的,提示这里没有


返回值。
②函数的最后一个参数可以是参数数组,既然是参数数组,那么参数的个数就是不定的,那么就需要params定义参数数组,例如:
   static int SumVals(params int[] vals){}    (详见P116)
③值参数与引用参数
值参数:就是函数调用和使用时,都不会改变值参数的的值。实际就是:我永远都是这样的,都定型了,你能怎样?你来咬我啊!
引用参数:
1)ref关键字,所谓的引用传递参数,就是把上面参数的 原样 拿过来用,假若函数调用的时候,对引用的参数的改变了,那么之前的定义好的原参数也会改变。实际就是:我是这样的,你把我变了,


我就要变身了。
   所以ref两个原则:
首先就是引用的参数不能是常量(因为参数可能会被函数改变),
其次就是引用ref参数时,必须对原引用的参数进行初始化(如果不对引用的参数进行初始化,那就谈不上什么对参数的改变之说了)
ps:在函数定义和函数调用时,都要对参数进行引用的定义。即:ref修饰参数
输出参数:out
  类似ref,都是引用传递值,这是共通的!
  但是out引用的参数必须初始化,即使是把一个已赋值的参数(变量)用out修饰,那么在函数调用时,就会把这边变量初始化。总之:out修饰的变量在函数调用时都会初始化或者说out修饰的必须是


未被辅助的变量,
   这里的只出不进就是这个意思。就是out修饰的变量都是为赋值的,没有进之说,但是函数调用完,会输出out修饰的参数
   ref的有进有出,也就是说变量有原初值,函数调用以后,可能会改变,会输出ref修饰的变量。这就是有进有出。
ps:函数定义时,不管是用ref还是out,都是对参数的一个限定,限定它是输入型(ref)还是输出型的(out)。
例如:MaxValue(int[] myarray ,ref int MyNumber){函数定义是要定义参数类型},
     调用时直接调用参数名称即可MaxValue(myarray , ref MyNumber)
④关于变量的作用域的问题(p143)
static void Main(string[] args)
11         {
12            string[] names = { "梅西", "卡卡", "郑大世" };
13             string s;
14 //在for循环语句不是个s赋值了,怎么还是报错“局部变量S未赋值”
15             for (int i = 0; i < names.Length-2; )
16             {
17                  s=names[i]+"|";
18                  Console.Write(s);
19                  i++;
20             }
21             s=s+names[names.Length-1];
22             Console.WriteLine(s);
23 
24             Console.ReadKey();
25         }
   对于变量s虽然定义了,但是没有初始化,所以并没有给变量s一个内存空间的分配,当在循环体累进行了初始化,所以实际是在循环体内给s分配了内存空间,实际就是定义了一个局部变量,当循环


体结束的时候,变量的生命周期也就结束了。所以当在循环体外使用变量s的时候,其实是上面的那个全局变量只定义没有初始化,所以会报错是局部变量s未赋值。
  解决方法:一个良好的编码习惯就是当定义某个变量的时候,尽量吧把它初始化,只有初始化,才会给他分配内存空间。即string s = "" ;所以在循环体也是全局变量的作用于范围,在循环体的改变


了s的值,在后续循环体的访问变量S的时候,是循环体的改变之后的值,实际就是循环体外可以访问循环体的值。【重中之重】想要循环体结束还是某个初始值的话,要在循环体的末尾重新定义变量


string  s ="";
⑤多态是面向对象编程中三大机制之一,其原理建立在"从父类继承而来的子类可以转换为其父类"这个规则之上,换句话说,能用父类的地方,就能用该类的子类.当从父类派生了很多子类时,由于每个子类


都有其不同的代码实现,所以当用父类来引用这些子类时,同样的操作而可以表现出不同的操作结果,这就是所谓的多态. 【继承的逆向】
⑥所有的类只能有一个基类,如果是基类是抽象类,那么派生类就要实现基类的所有抽象成员。其实实际:我本来张的就抽象,还想继承我的基因,就得让你明白继承我的基因就有风险的,那么必须我


的愿望都得实现。
⑦对于继承的基类和接口的书写顺序
   public class ss :mybase,Interface{}
⑧类和接口默认的都是内部类和接口,要想成为公共的访问的,必须加public
⑨C# typeof() 和 GetType()区是什么?
1、typeof(x)中的x,必须是具体的类名、类型名称等,不可以是变量名称。 
2、GetType()方法继承自Object,所以C#中任何对象都具有GetType()方法,它的作用和typeof()相同,返回Type类型的当前对象的类型。 


比如有这样一个变量i: 
Int32 i = new Int32(); 


i.GetType()返回值是Int32的类型,但是无法使用typeof(i),因为i是一个变量,如果要使用typeof(),则只能:typeof(Int32),返回的同样是Int32的类型。






1)析构 Finalize()
2)构造函数中的this关键字:如public MyBase():this(5,6){}
    public MyBase():base(i){}
是先调用除自身的其他费默认的构造函数,就是我用了this就是我级别最靠后,你先调用其他的。但是要避免进入死循环。两个都用this,就是你先用他,他说你先用他,就这样,谁都用不了


谁。。。就成了死循环!!!
3)接口不能包括 字段、构造函数、析构函数、常量、静态函数(因为接口要在用接口的类中实现)
4)结构是值类型,类是引用类型
5)浅度复制:利用MemberwiseClone()方法,不考虑引用类型
   深度复制:利用ICloneable接口,已标准的方式进行复制,就是创建成员的新实例(复制值,而不复制引用)
6)关于字段、方法的命名的方式:公有字段 PascalCasing
私有字段  camelCasing
7)字段的定义: readonly  就是只读字段,只能在构造函数中赋值或者在初始化赋值语句中赋值,实际就是只能在起字段初始化的时候定义其值,其他时候不允许改变
               static    静态字段,对于静态字段的访问,要直接用类名进行访问,不能用类对象访问,如:class MyClass {  public static  MyInt   ; }   MyClass.MyInt
                         静态的方法也是只能用类名访问,不能用类对象进行访问。
 8)方法的修饰词: virtual  【可以重写我】      虚函数,就是可以写在父类中,这表明这个函数可以重写,因为他是虚函数,因为虚,所以可以重新构造它
  override 【我是重写的别人】  这个是写在派生类中的方法,使用这个关键字就是对基类的那个方法重写了
          abstract  【儿子必须实现我】  抽象函数,这个关键字是定义基类的方法的,证明这个基类方法是抽象的(一般用于抽象类中),但是这里必须在基类对他进行重写实现。

9)关于new隐藏基类的同名方法与重写的区别

使用Override修饰符对方法进行重写时,基类中的方法必须是Abstract或Virtual的,这时使用override修饰符,就可以修改基类中抽象或虚方法的实现。

隐藏基类中的方法一般是使用new关键字,并不要求基类中的方法是Abstract或Virtual,可以使用new关键字重写基类中的方法。

代码中Apple的OutputSubClass方法隐藏了基类中的同名方法,而基类中的方法并没有虚拟或抽象修饰符,这就是方法的隐藏。就是隐藏按了基类的同名方法假若子类的对象赋予基类的对象(baseclass=my objclass),调用的也是子类的方法,因为基类的方法被隐藏了!(P218)

但是这种方法不应该过多地使用,因为它破坏了类型之间良好的继承关系,容易造成理解和维护上的困难

0 0
原创粉丝点击