C#基础必读 修饰符、关键字、数据类型辨析

    技术2022-05-12  25

    C#基础必读 修饰符、关键字、数据类型辨析

     

    做些技术积累,高手不要见笑。因为C#有点Java和C++杂交的味道,太容易让人记混了。

    指定声明的类型和类型成员的可访问性。 public:                       访问不受限制, 任何地方都可以访问。 protected:                        访问仅限于类或派生类。 private:                      访问仅限于类 internal:                       访问仅限于当前程序集。 protected internal:                        访问仅限于当前程序集或派生类。  -----------------------------------------------------------   一个成员或类型只能有一个访问修饰符 命名空间上不允许使用访问修饰符。命名空间没有访问限制。 不嵌套在其他类型中的顶级类型的可访问性只能是 internal 或 public。这些类型的默认可访问性是 internal。 类中成员的默认可访问性是private 命名空间中的类型可访问性只能是 internal 或 public。这些类型的默认可访问性是 internal。   ------------------------------------------------------------  abstract:    抽象类    不能被实例化    可包含抽象方法和抽象属性    派生类必须实现抽象基类的所有抽象成员,通过重写抽象成员实现。    ------------------------------------------------------------ Sealed    密封类             不能被继承 , 可防止意外的继承    abstract 修饰符与密封类一起使用是错误的。    结构是隐式密封的,因此它们不能被继承。   ps:我晕,Java中final关键字的翻版。 ------------------------------------------------------------- static      静态类: 仅包含静态成员。 不能被实例化。不能使用 new 关键字创建静态类的实例 是密封的。 不能包含实例构造函数, 可包含静态构造函数  ------------------------------------------------------------- 成员修饰符 abstract:          方法或属性不能实现。都是隐式虚拟,且在派生类中必须实现。        const       它指定字段(域)成员或局部变量的值是常数,不能被修改。        不允许在常数声明中使用 static 修饰符 。 event:               声明事件。 extern:               指示方法在外部实现. virtual:              指示一个方法或属性可以被派生类改写. override:              对由基类继承的虚( virtual )、抽象(abstract)的成员的新实现. readonly:            指示一个域成员只能在声明时以及相同类的构造函数中被赋值. static:           指示一个成员属于类,而不是属于类的实例. 可用于域成员、方法、属性、操作符、构造函数 ----------------------------------------------------------- 此段摘自: http://www.cnblogs.com/sutengcn/archive/2008/06/13/1219240.html   1,整型     C# 支持九种整型: sbyte、 byte、 short、 ushort、 int、 uint、 long、 ulong和 char。     其中char类型比较特殊。虽然属于整型类别。但是以下两个方面不同于其他整型:     1)不存在从其他类型到 char类型的隐式转换。具体说来,即使 sbyte、 byte和 ushort类型具有完全可以用 char类型来表示的值范围,也不存在从 sbyte、 byte或 ushort到 char的隐式转换。      2 )char类型的常数必须写成字符或带有强制转换为类型 char的整数。例如, (char)10与 '"x000A'是相同的。 2,浮点型      C# 的浮点型包括:float和double。     float类型可表示精度为 7 位、在大约 1.5 × 10− 45 到 3.4 × 10 38 的范围内的值。 double类型可表示精度为 15 位或 16 位、在大约 5.0 × 10− 324 到 1.7 × 10 30 8 的范围内的值。     浮点型精度较低,不推荐两个浮点型之间比较大小的判断。 3,decimal类型      decimal 类型是适合财务和货币计算的 128 位数据类型。     decimal类型可以表示具有 28 或 29 个有效数字、从 1.0 × 10 -28 到大约 7.9 × 10 28 范围内的值。     decimal类型是采用四舍六入五考虑的银行家舍入法进行计算的。 4,值类型     PS: 这图不错! ------------------------------------------------------------------ const 、 readonly区别    const 字段只能在该字段的声明中初始化。    readonly 字段可以在声明或构造函数中初始化。    因此,根据所使用的构造函数,readonly 字段可能具有不同的值。    const 字段为编译时常数    readonly 字段可用于运行时常数    const 字段类外通过类名访问    readonly 字段通过类实例(实例变量)或类(静态变量)访问 ------------------------------------------------------------------  对于那些本质上应该是常量,但是却无法使用 const来声明的地方,可以使用 static readonly   下面是一段关于C#继承与封装的程序,不过我估计这应该是最老的一个写法了,现在C#的语法糖,应该 已经有更方便的实现方式了,只不过我还没接触到。   using  System; namespace  test{ public    class   Student{            private   string  student_id;   // 学号      private   string  student_name;   // 姓名      public   static    string   information = " ---------学生上课情况表---------- " ;     public   Student( string  id, string  name)   // 构造函数     {        student_id = id;        student_name = name;    }     public   string  StudentID     //  用于访问私有字段 student_id的属性     {          get          {  return  student_id;}         set           {  student_id = value;}     }     public   string  StudentName   //    用于访问私有字段 student_name的属性     {          get          {  return  student_name;}         set           {  student_name = value;}    }     public   string  AddressClass( int  i)    {         string  CAddress;         if (i == 1 )        CAddress = " 2楼 " ;   // 研究生在2楼上课          else         CAddress = " 3楼 " ;   // 本科生在3楼上课          return   CAddress;    }} public   class  Graduate:Student{     public   Graduate( string  i,  string  j,  string  tn):  base ( i, j )        {   teacher_name = tn;   }     public   string  TeacherName   //    用于访问私有字段 student_name的属性     {          get          {  return  teacher_name;}         set           { teacher_name = value;}    }         private   string  teacher_name;  // 导师名 } class  AppStudent{     public   static   void  Main(){        Console.WriteLine( " {0} " ,Student.information);        Graduate gs = new  Graduate( " 2007480*** " , " 哈哈 " , " 施杨 " );        Console.WriteLine( " 研究生学号={0} " ,gs.StudentID);   // 调用属性StudentID         Console.WriteLine( " 研究生姓名={0} " ,gs.StudentName);   // 调用属性StudentName         Console.WriteLine( " 研究生上课地点={0} " ,gs.AddressClass( 1 ));   // 调用方法         Console.WriteLine( " 教师姓名={0} " ,gs.TeacherName);        Console.ReadLine();    }}}   ----------------------------------------------------------------------------------   base关键字          base 关键字用于从派生类中访问基类的成员 ---------------------------------------------------------------------------------- 方法的覆写与调用  

     

    using  System; namespace  test{  class   BaseClass{    public   void  TestMethod(){   Console.WriteLine( " BaseClass:: TestMethod " );  } }  class   DerivedClass:BaseClass{   new   public   void  TestMethod(){    base . TestMethod();   // base访问基类中被隐藏的方法    Console.WriteLine( " DerivedClass:: TestMethod " );  } }  class  App {    public   static   void  Main(){    DerivedClass  t  = new  DerivedClass();    t.TestMethod();      // 调用DerivedClass:: TestMethod()      ((BaseClass)t). TestMethod();      // 调用BaseClass:: TestMethod()     Console.ReadLine();   } }}

     

    ------------------------------------------------------------------------------- 引用参数:       ref修饰符声明,不创建新的存储位置       变量被作为实参传递前,自身必须被明确赋值。       引用参数被认为是初始化过的。         out修饰符声明,不创建新的存储位置       变量被作为实参传递前,自身不需要明确地赋值。       调用后,实参变量被认为已被明确赋值       输出参数被认为是未初始化过的。       返回之前,必须为每一个输出参数明确地赋值。       实现多值返回     参量参数:     params修饰符声明     一个参量参数必须是形式参数列表中的最后一个     参量参数的类型必须是一个单维数组类型。     例如,类型int[]可以被用作参量参数类型,但是类型int[,]不能用。   using  System; namespace  test{ class  Test{     static   void  F( params   int [] args){    Console.WriteLine( " # of arguments: {0} " , args.Length);     for  ( int  i  =   0 ; i  <  args.Length; i ++ )        Console.WriteLine( " /t args[{0}] = {1} " , i, args[i]);    }     static   void  Main(){        F( );         F( 1 2 );        F( 1 2 3 );        F( new   int [] { 1 2 3 4 });        Console.ReadLine();    }}}   PS:Java里没有,个人觉得有点多余。 --------------------------------------------------------------------------------  多态上要强于Java,因为Java中的子类中如果有与父类同名同参的方法,必须覆写,否则报错,而C#可以new一个方法,从而实现 在不改变父类方法的同时,新开辟一块内存空间,保存子类的同名同参方法。但是同样Java中的继承机制也没有C#复杂,但是也不失 简练,子类不用重写父类方法,就可以用super调用。Java中的接口对应C#中的虚函数。相对而言,比较习惯用Java的接口。   as运算符的功能与强制类型转换类似。         可将一个对象强制转换为另一类型。         如果源类型无法转换为目标类型,则首先将其置为null,然后再转换为目标类型    

    作者:施杨(施杨de编程世界)出处:http://www.cnblogs.com/shiyangxt本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。


    最新回复(0)