首页 | 互联网 | IT动态 | IT培训 | Cisco | Windows | Linux | Java | .Net | Oracle | 软件测试 | C/C++ | 嵌入式开发 | 存储世界 | 服务器
网络设备 | IDC | 安全 | 求职招聘 | 数字网校 | 网页设计 | 平面设计 | 技术专题 | 电子书下载 | 教学视频 | 源码下载 | 搜索 | 博客 | 论坛
中国IT实验室Dotnet频道
中国IT教育
Google
首页 ASP.NET  C#  XML/WebService ADO.NET VC.NET VB.NET .NET 资讯动态 专题 RSS订阅 讨论 下载
您现在的位置: 中国IT实验室 >> Dotnet >> C# >> 正文

展现C#世界之五:类的介绍

  输入参数按C/C++程序员早已习惯的工作方式工作。如果你来自VB,请注意没有能被编译器处理的隐式ByVal或ByRef——如果没有设定,参数总是用值传递。

  这点似乎与我前面所陈述的有冲突:对于一些变量类型,用值传递实际上意味着用引用传递。迷惑吗? 一点背景知识也不需要:COM中的东西就是接口,每一个类可以拥有一个或多个接口。一个接口只不过是一组函数指针,它不包含数据。

  重复该数组会浪费很多内存资源;所以,仅开始地址被拷贝给方法,它作为调用者,仍然指向接口的相同指针。那就是为什么对象用值传递一个引用。

  5.2.1.2 引用参数

  尽管可以利用输入参数和返回值建立很多方法,但你一想到要传递值并原地修改它(也就是在相同的内存位置),就没有那么好运了。这里用引用参数就很方便。

  void myMethod(ref int nInOut)

  因为你传递了一个变量给该方法(不仅仅是它的值),变量必须被初始化。否则,编译器会报警。清单 5.2 显示如何用一个引用参数建立一个方法。

  清单 5.2 通过引用传递参数

  1: // class SquareSample

  2: using System;

  3:

  4: public class SquareSample

  5: {

  6: public void CalcSquare(ref int nOne4All)

  7: {

  8: nOne4All *= nOne4All;

  9: }

  10: }

  11:

  12: class SquareApp

  13: {

  14: public static void Main()

  15: {

  16: SquareSample sq = new SquareSample();

  17:

  18: int nSquaredRef = 20; // 一定要初始化

  19: sq.CalcSquare(ref nSquaredRef);

  20: Console.WriteLine(nSquaredRef.ToString());

  21: }

  22: }

  正如所看到的,所有你要做的就是给定义和调用都加上ref限定符。因为变量通过引用传递,你可以用它来计算出结果

  并传回该结果。但是,在现实的应用程序中,我强烈建议要用两个变量,一个输入参数和一个引用参数。

  5.2.1.3 输出参数

  传递参数的第三种选择就是把它设作一个输出参数。正如该名字所暗示,一个输出参数仅用于从方法传递回一个结果。它和引用参数的另一个区别在于:调用者不必先初始化变量才调用方法。这显示在清单5.3中。

  清单 5.3 定义一个输出参数

  1: using System;

  2:

  3: public class SquareSample

  4: {

  5: public void CalcSquare(int nSideLength, out int nSquared)

  6: {

  7: nSquared = nSideLength * nSideLength;

  8: }

  9: }

  10:

  11: class SquareApp

  12: {

  13: public static void Main()

  14: {

  15: SquareSample sq = new SquareSample();

  16:

  17: int nSquared; // 不必初始化

  18: sq.CalcSquare(15, out nSquared);

  19: Console.WriteLine(nSquared.ToString());

  20: }

  21: }

  5.2.2 改写方法

  面向对象设计的重要原则就是多态性。不要理会高深的理论,多态性意味着:当基类程序员已设计好用于改写的方法时,在派生类中,你就可以重定义(改写)基类的方法。基类程序员可以用 virtual 关键字设计方法:

  virtual void CanBOverridden()

  当从基类派生时,所有你要做的就是在新方法中加入override关键字:

  override void CanBOverridden()

  当改写一个基类的方法时,你必须明白,不能改变方法的访问属性——在这章的后面,你会学到更多关于访问修饰符的知识。

  除了改写基类方法的事实外,还有另一个甚至更重要的改写特性。当把派生类强制转换成基类类型并接着调用虚拟方法时,被调用的是派生类的方法而不是基类的方法。

  ((BaseClass)DerivedClassInstance)。CanBOverridden();

  为了演示虚拟方法的概念,清单 5.4 显示如何创建一个三角形基类,它拥有一个可以被改写的成员方法(ComputeArea)。

上一页  [1] [2] [3] [4] [5] [6] [7] 下一页

【责编:John】

中国IT教育

相关产品和培训
文章评论
 友情推荐链接
 认证培训
 社区讨论
 博客论点
 Dotnet频道相关导航