在几周内,我将教授一类一年级工程师作为他们第一年编程课程的一部分,这是C#的重要参考点。他们中的大多数人以前从未编程,并且在学习对象时遇到了足够的麻烦,因此教学参考将是一场艰苦的战斗。我计划让很多学生可以自己学习,但如果基础概念没有“点击”,只是展示一堆例子往往会非常压倒性。
所以我会把这个问题提交给SO社区:你看过教学参考文献的最佳方式是什么?是什么让它“点击”给你?是否有任何与我有关的参考资料?
我的暂定课程计划是:
答案 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有一些使它们与“地址”不同的东西: