C#高级编程笔记之第三章:对象和类型

 

 

3.2 类和结构

  类与结构的区别是它们在内存中的存储方式访问方式(相似存储在堆上的引用类型,而结构是存储在栈上的值类型)和它们的一些特征html

  语法上,类与结构很是类似,主要区别是结构使用关键字 struc代替 class 来声明。编程

 

3.3 类成员

  3.3.1 数据成员函数

    数据成员是包含类数据—字段常量事件的成员。布局

 

  3.3.2 函数成员post

    函数成员提供了操做类中数据的某些功能,包括方法属性构造函数析构函数(终结器)运算符以及索引器性能

    1. 方法

        ref 和 out 的区别:this

        ref 在传递以前必须已经被初始化,out 则不要求。url

        ref 的实质是将值类型进行引用传递,而 out 是为了增长返回值。spa

        命名参数:在传递参数的过程当中能够指定其名字,格式为 MethodName (ParameterName : Value )code

        Params 关键字 : 必须在方法参数的最后面。

        方法的重载:不能仅在返回类型上有区别,不能仅根据声明 ref 、 out 或 params 之间区分。

 

    1. 属性

        概念:属性是一个或一对方法,在客户端代码看来,它(们)是一个字段。

        get访问器不带任何参数,且返回属性声明的类型。

        set访问器带一个value参数,其类型与声明的类型相同。

        属性的访问修饰符:在getset访问器中,必须有一个具有属性的访问级别。

 

    1. 构造函数

        声明构造方式就是声明一个与包含的类同名的方法,但该方法没有返回值。

        若是提供了带参数的构造函数,编译器就不会自动提供默认的构造函数。

 

        (1)静态构造函数

          编写静态构造函数的缘由:类中有一些静态字段或属性,须要在第一次使用类以前,从外部源中初始化这些字段和属性。

          .NET运行库没有确保何时去执行静态构造函数,因此不该该要求在某个特定时刻执行静态构造函数中的代码。但能够确保的是,它在全部引用前只会调用一次。

          无参构造函数能够与静态构造函数在同一个类中定义。

 

        (2)从构造函数中调用其它构造函数

          base 与 this 关键字

 

   3.3.3 只读字段

    readonly 与 const 的区别:

    readonly 能够在构造函数中赋值,而 const 哪里都不能赋值,只能初始化。

 

3.4 匿名类型

    var 和 new 关键字一块儿使用能够建立匿名类型,例如。

 1  static void Main(string[] args)
 2 
 3 
 4         {
 5 
 6 
 7             var test = new { Name = "Earl Jones", Age = 17 };
 8 
 9 
10             Console.WriteLine(test.ToString());
11 
12 
13             Console.WriteLine(test.Name.GetType().ToString());
14 
15 
16             Console.WriteLine(test.Age.GetType().ToString());
17 
18 
19             Console.ReadKey();
20 
21 
22         }

    输出结果以下:

    

    咱们并不知道这个对象的类型,编译器为其“伪造”了一个名称,可是只有编译器才能使用它,咱们不能也不该该使用新对象上的任何类型反射,由于这不会获得一致的结果。

 

3.5 结构

  •   结构是值类型,不是引用类型,其生命周期的限制与简单的数据类型同样,传递结构时可使用ref关键字来减小性能损耗。
  •   结构通常用于表达简单的组合数据。
  •   结构不支持继承,但全部结构都继承于System.ValueType,而System.ValueType又继承于System.Object
  •   使用结构,能够指定字段如何在内存中布局。
  •   对于结构,编译器老是提供默认无参构造函数,它不容许被替换,也不能在结构中为字段提供初始值,必须在构造函数中提供。
  •   结构中的公有字段为可接受的编程方式。
  •   在定义结构时使用new关键字只不过是用于调用其构造函数,变量的声明实际上才是为结构分配空间,因此如下代码不被报错。
1 MyStruct myStruct /*= new MyStruct()*/; 2 myStruct.Name = "Earl Jones"; 3 myStruct.Age = 17;

  覆盖结构默认的构造函数会报错

    

 

 

3.6 弱引用

  在代码中实例化一个类或结构时,只要有代码引用它,就会造成强引用。

  强引用和弱引用的区别是,强引用只要有引用就不会被GC回收,而弱引用随时均可能被GC回收,因此使用它的时候必须肯定其是否存活。如:

1  MyClass myClass; 2     WeakReference weakMyClass = new WeakReference(new MyClass());
3 if (weakMyClass.IsAlive) 4 { 5 myClass = weakMyClass.Target as MyClass; 6 Console.WriteLine(myClass.value); 7 }

 

3.7 部分类

  Partial关键字能够容许把类、结构、方法或结构放在多个文件中。

  若是声明相似使用了下面的关键字,这些关键字就必须应用于同一个类的全部部分:

  •   访问修饰符
  •   abstract
  •   sealed
  •   new
  •   通常约束

 

3.9 Object

  全部类都继承自System.Object类。

  方法:

  • ToString();
  • GetHashCode();
  • Equals();这里有三个比较三个用于比较对象相等性的方法。
  • Finalize();
  • GetType();
  • GMemberwiseClone();

 

3.10 扩展方法

  扩展方法用于在某些不能直接修改源代码中的类中添加方法。

 

 1         using System;
 2         
 3         namespace 扩展方法
 4         {
 5             class Program
 6             {
 7                 static void Main(string[] args)
 8                 {
 9                     MyClass myClass1 = new MyClass();
10                     myClass1.SayHiToSomeone();
11                     myClass1.SayHi();
12                     Console.ReadKey();
13                 }
14             }
15         
16             class MyClass
17             {
18                  public void SayHi()
19                 { 
20             Console.WriteLine("我是最原始的方法"); 
21             }
22             }
23         
24             static class AddMyClass
25             {
26                 static public void SayHiToSomeone(this MyClass myClass)
27                 { 
28             Console.WriteLine("我是一个扩展方法"); 
29             }
30         
31                 static public void SayHi(this MyClass myClass)
32                 {
33              Console.WriteLine("我是扩展方法SayHi");
34              }
35             }
36         }

  输出的结果:

  

  由上得出:

  •     扩展方法必须定义在一个静态类中。
  •     扩展方法的第一个参数为放在 this 后的类,这个方法就是这个类的一部分。
  •     便是扩展方法是一个静态方法,也要使用调用实例方法的语法经行调用。
  •     若是扩展方法与类中某个方法同名,就历来不会调用扩展方法。

 

 

 

 

 

本文部分摘录自C#高级编程第九版,其他由Earl Jones整理及总结而成,本人能力有限,若有纰漏望及时指出。

 

若是你喜欢此书,或想了解更详细内容,请购买正版书籍进行查阅。

 

转载请注明出处。

相关文章
相关标签/搜索