C#中的教学参考

时间:2009-10-29 20:34:40

标签: c# reference pass-by-reference value-type reference-type

在几周内,我将教授一类一年级工程师作为他们第一年编程课程的一部分,这是C#的重要参考点。他们中的大多数人以前从未编程,并且在学习对象时遇到了足够的麻烦,因此教学参考将是一场艰苦的战斗。我计划让很多学生可以自己学习,但如果基础概念没有“点击”,只是展示一堆例子往往会非常压倒性。

所以我会把这个问题提交给SO社区:你看过教学参考文献的最佳方式是什么?是什么让它“点击”给你?是否有任何与我有关的参考资料?

我的暂定课程计划是:

  1. 什么是参考(使用argument like Eric Lippert's
  2. 引用和垃圾收集器
  3. 参考类型和值类型
  4. 不可变类型
  5. 按引用传递与按值传递(以及通过值传递的对象引用的all of the subtleties
  6. 如果您不理解1-5,会产生一些令人讨厌的例子。

8 个答案:

答案 0 :(得分:5)

我听过它解释的一种方法是使用手机或对讲机。您(教师)持有一端并声明您是一个对象实例。当学生在教室周围通过另一端(如果它是一部手机的扬声器电话)时,你会呆在一个地方(即堆)。

他们可以通过他们对你的“参考”与你互动,但他们并没有真正拥有“你”。

答案 1 :(得分:3)

答案 2 :(得分:2)

我喜欢描述Reference和Value类型之间差异的URL类比。您可以传递URL作为对某些内容的引用。您可以修改该URL而无需修改该内容。您还可以通过URL访问内容,以修改内容。

这是一个有用的参考:

 http://www.yoda.arachsys.com/csharp/parameters.html

答案 3 :(得分:2)

尝试用数字解释引用,因为纯文本有时无法通过大多数人。关于这个主题的许多资源和书籍都试图通过数字来解释,因为单独通过语言交流很难将分配联系起来(这主要是大多数人关注的问题)。

至少试着指出对象如何相互关联,一个简单的例子就是一个简单的引用。

假设:

class A {
    B b = new B();
}

class B {
   int mine = 1;
}

当从某个上下文将类A实例化为对象a时,下图将说明它将如何在堆中查看。插图的目的是展示不同对象如何相互关联,并具有堆如何工作的心智模型。

         +-A-----+
a: *---->|       |
         |       |   +-B--------+
         | b: *--+-->|          |
         |       |   | mine: 1  |
         +-------+   |          |
                     +----------+

还尝试解释堆和堆栈分配之间的区别。使用参数调用方法。简单的例子是这样的:

考虑以下方法:

public void doSomething(B b) {
   int doMine = b.mine + 1;
}

当调用doSomething并让它执行此操作时,最后doSomething的堆栈将如下所示。显示对象不直接驻留在堆栈中的点,但它只是引用堆中的对象,对象通过引用共享。

whoever called doSomething *
                           |
                           v
+-doSomething-+   +-B--------+
| b: *--------+-->|          |
|-------------|   | mine: 1  |
| doMine: 2   |   +----------+
+-------------+

另一个说明性的例子是说明一个对象的数组,而一个多维数组包含一个数组数组。

答案 4 :(得分:1)

我发现this article对于解释C#中的参数传递非常有用。本文还很好地解释了一般术语中的价值和参考类型。

这更像是一种视觉表现,对我帮助很大。

答案 5 :(得分:1)

图片和图表。

人们形成他们正在学习的概念的心理图像,引用的可视化表示及其与相关对象的关系是一个很好的开始方式。同样,将对象可视化为包含成员变量(包括对其他对象的引用)和成员方法(一种UML图表)非常有用。

稍后,如果您觉得有必要,可以深入研究如何实际实现引用和基本类型的细节。但是要尽可能地延迟这些讨论,因为人们可能会陷入困境,试图将抽象概念与代表性细节配对,从而分散对学习抽象概念的注意力。

答案 6 :(得分:1)

当我学习VB6时,参考文献实际上让我感到困惑。然后我尝试学习C ++,在处理指针后,引用对我来说非常有意义。从一个实际发生的角度来理解它比从概念角度理解它更容易。也许你可以在课程中查看引擎盖下的内容。

答案 7 :(得分:1)

我建议尽量减少一个人使用的短期“引用”,因为它可以在.net中用来指代两个非常不同的东西:类型存储位置的内容,以及用“ref”传递的参数“资格赛。前者使用术语“对象引用”,后者使用“ref参数”。

在描述“对象引用”是什么时,我建议使用术语“对象ID”。对象ID有一些使它们与“地址”不同的东西:

  1. 使用对象ID不能做很多事情。可以测试一个是否为空,检查它们中的两个是否相等,将一个复制到合适类型的存储位置,或者查找一个引用的对象并要求它做某事。大多数使用类类型值或变量执行某些操作的请求实际上是请求对引用的对象执行某些操作。请注意,人们不能以获取另一个对象的ID的方式操纵一个对象的ID,就像使用地址一样。
  2. 虽然系统必须具有将对象ID转换为地址的方法,但无法保证它将使用任何特定的方法来执行此操作。也没有任何保证与任何对象ID相关的位模式不会自发地改变;所有保证的是,如果位模式改变,新模式将引用与旧模式相同的对象。
  3. 系统会跟踪存储对象ID的每个位置。只要存在对象ID的任何副本,该对象ID将永远不会引用除创建它之外的任何对象实例。相比之下,一般而言,使用地址的系统不会跟踪可能复制地址的每个地方。一个对象可能不再存在,而某人仍然拥有其地址的副本,并且可能使用相同的地址创建一些新对象。