C#高级编程(三)-对象和类型详解


本文摘自PHP中文网,作者黄舟,侵删。

3.2 类和结构

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

  语法上,类与结构非常相似,主要区别是结构使用关键字 struct 代替 class 来声明。

3.3 类成员

  3.3.1 数据成员

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

  3.3.2 函数成员

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


    1. 方法

        ref out 的区别:

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

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

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

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

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


    1. 属性

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

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

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

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


    1. 构造函数

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

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

        (1)静态构造函数

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

          .NET运行库没有确保什么时候去执行静态构造函数,所以不应该要求在某个特定时刻执行静态构造函数中的代码。但可以确保的是,它在所有引用前只会调用一次。

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

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

          base this 关键字

   3.3.3 只读字段

    readonly const 的区别:

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

3.4 匿名类型

    var new 关键字一起使用可以创建匿名类型,例如。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

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

2

3

1 MyStruct myStruct /*= new MyStruct()*/;

2 myStruct.Name = "Earl Jones";

3 myStruct.Age = 17;

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

    

3.6 弱引用

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

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

1

<span style="font-family: 'Microsoft YaHei';"><span style="color: #008080;">1</span> <span style="color: #000000;">    MyClass myClass;<br></span><span style="color: #008080;">2</span>     WeakReference weakMyClass = <span style="color: #0000ff;">new</span> WeakReference(<span style="color: #0000ff;">new</span><span style="color: #000000;"> MyClass());<br></span><span style="color: #008080;">3</span>     <span style="color: #0000ff;"><a href="http://www.php.cn/wiki/109.html" target="_blank">if</a></span><span style="color: #000000;"> (weakMyClass.IsAlive)<br></span><span style="color: #008080;">4</span> <span style="color: #000000;">     {<br></span><span style="color: #008080;">5</span>          myClass = weakMyClass.Target <span style="color: #0000ff;">as</span><span style="color: #000000;"> MyClass;<br></span><span style="color: #008080;">6</span> <span style="color: #000000;">         Console.WriteLine(myClass.value); <br></span><span style="color: #008080;">7</span> <span style="color: #000000;">      } </span></span>

3.7 部分类

  Partial关键字可以允许把类、结构、方法或结构放在多个文件中。

  如果声明类似使用了下面的关键字,这些关键字就必须应用于同一个类的所有部分:

  •   访问修饰符

  •   abstract

  •   sealed

  •   new

  •   一般约束

3.9 Object类

  所有类都继承自System.Object类。

  方法:

  • ToString();

  • GetHashCode();

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

  • Finalize();

  • GetType();

  • GMemberwiseClone();

3.10 扩展方法

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


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

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#高级编程(三)-对象和类型详解的详细内容!

相关阅读 >>

C# 使用npoi生成word文档(按照模板)

详解C#读取xml多级子节点的示例代码

C# tabcontrol组件如何切换显示form窗体的示例代码

C#日期格式转换的公共方法类的实现详解

C# system.drawing.region类的方法使用(图解)

页面包含处理实例详解

C#注册控件处理程序(setconsolectrlhandler)函数示例的详细介绍

C# .net 将list序列化

C#实现网络电子白板、课件功能 (在线教学系统)

分享多线程下C#如何保证线程安全

更多相关阅读请进入《C#》频道 >>




打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,您说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

分享从这里开始,精彩与您同在

评论

管理员已关闭评论功能...

    暂无评论...