【问题标题】:At What point should you understand References?您应该在什么时候理解参考文献?
【发布时间】:2011-02-16 14:57:45
【问题描述】:

我在一个入门级程序员的面试中问了这样一个问题:

var instance1 = new MyObject{Value = "hello"}
var instance2 = instance1;

instance1.Value = "bye";

Console.WriteLine(instance1.Value);
Console.WriteLine(instance2.Value);

申请人以“你好”、“再见”作为输出。

我的一些同事说,“指针”不再那么重要,或者这个问题不是真正的能力评判。

他们说的对吗?

编辑:重点是 MyObject 可能是一个结构。这是一个好点。但是,我没有发布我向受访者提出的完整问题。完整的问题有一个显然是一个类(不是结构)的类。可以找到here。

【问题讨论】:

  • 那些不是指针。这些是参考。
  • 指针,也许不是。这是 LOB 开发人员通常不需要的低级内存管理。另一方面,参考文献是绝对关键的。
  • 10 分的精彩信息!如果你不能这样做,那么“再见”
  • 您应该在示例中明确说明 myObject 是结构还是类,因为这会影响输出。另外,为什么要调用类型myObject?
  • 正如威尔指出的那样,这个问题是模棱两可的。您还隐含地假设 myObject 具有行为良好的 Value 属性,该属性不会在后续获取时返回不同的值。据我所知,程序的真正输出是“I'm”“evil”。

标签: c# pointers


【解决方案1】:

他们完全错了。此外,这是一个关于引用的问题,而不是指针。如果你不明白,你就不配获得一份有报酬的 C# 工作。

【讨论】:

  • 我有一个在游戏中玩了很久的老板,我发现他通过引用明确传递了 C# 容器。
  • @mikerobi,究竟什么是“C# 容器”?
  • @unforgiven3 我的意思是像 ArayList 这样的集合。
【解决方案2】:

我的一些同事说“指针”不再那么重要了

了解引用语义和值语义之间的区别至关重要。它是语言和类型系统设计的基础。理解可以用指针实现引用对于入门级 C# 程序员来说并不是特别重要。理解引用复制和价值复制之间的区别是高度相关的。

或者说这个问题不是真正的能力评判。

这取决于您尝试测试的能力。如果快速准确地预测琐碎 C# 程序行为的能力与您的工作相关,那么我会说这是一个很好的能力测试。

如果确定何时没有提供足够信息来解决问题的能力以及提出正确问题以获取该信息的能力是相关的,那么是的,这是对相关能力的判断。 (一个好的候选人会要求查看类型 myObject 和成员 Value 的实现,而不是假设 myObject 是一个类,而 Value 是一个字符串类型的可变属性。)

我说所有这些能力都是相关的,对于入门级职位来说,这是一个合理的第一个问题。

【讨论】:

    【解决方案3】:

    这是非常基础的东西。问题甚至不是关于指针,而是关于 C# 中的引用语义,这是该语言最重要的方面之一。任何自称 C# 程序员的人都必须明白这一点。

    【讨论】:

      【解决方案4】:

      你应该在离开大学之前就了解指针和参考。

      我在注意到这个问题被标记为 C# 之前写了上面的内容。

      你不需要知道任何关于 C# 程序指针的知识。话虽如此,我还是坚持我作为一名专业程序员的一般意义上的原始陈述。

      此外,正如其他人所说,这个问题实际上是关于参考的。要成为 C# 程序员,您真的必须了解引用。

      【讨论】:

      • @dtb 指针是编程和计算机工作方式的基础,即使您选择的语言缺少它们。我什至不会考虑雇用不懂指针的人。
      • @Matt Greer:如果有人能完美地解释 pass-by-value、pass-reference-by-value 和 pass-by-reference 之间的区别,那么我会雇用他/她,甚至如果他/她不知道1U << ((*(uint*)(&f) >> 23) - 126) 做了什么。
      • @Dan:比如?我无法想象在开发 C# 程序时会出现任何情况,其中有人理解按值传递、按值传递引用和按引用传递之间的区别,但从未使用 C/C++ 编程并且没有知道指针可能会被这种缺乏知识所困扰。
      • @spender, dtb:字典无法阻止您这样做。想象一下某个类有一个名为 B 的单个 int 字段,并使用该字段实现 GetHashCode。如果您声明 var a = new MyObj(3) 然后将其插入 字典,然后执行 a.B = 8;字典的 ContainsKey 方法在使用 a 调用时将返回 false。由于哈希码现在不同了。
      • @Rubys:是的,这就是为什么你不将可变数据结构作为键放在字典中的原因。
      【解决方案5】:

      在开始接受 C# 面试之前,您应该了解参考资料。

      【讨论】:

      • 哈哈。好点子。我应该使用正确的“参考”。
      • 这个答案的明确意图是曲解问题并冒犯提出问题的人。它不会在讨论中添加任何内容。
      • 我的评论看起来比预期的要刻薄。 OP 最初提出的问题(检查编辑历史记录)明显不太清楚,这似乎是对指针与引用的真正误解。请不要这么快断章取意地判断一年。
      【解决方案6】:

      了解对象引用在 C# 中的工作原理我认为很重要。 (一个人当然可以在不知道任何事情的情况下生存很长的路……但很少有人愿意为 OO 代码付费)

      另一方面,指针不多。

      【讨论】:

        【解决方案7】:

        我认为这是一个公平的问题。

        请确保您不要简单地根据通过/失败来给这个问题评分。跟进诸如“为什么?”之类的问题。和“行'instance1.Value =“再见”到底是什么? ' 或行 'var instance2 = instance1;'真正做到了吗?”就幕后发生的事情展开对话。通过候选人进行转换的深度以及他们是否能够听从您的解释,您将了解很多关于候选人的信息。

        【讨论】:

          【解决方案8】:

          如果候选人不能回答这个问题,则表明他们对 C# 的基本知识非常缺乏。带他们开门,说再见!

          【讨论】:

            【解决方案9】:

            即使你不使用指针和不安全的代码,你绝对应该理解这个概念并知道如何使用它。 如果你要使用 C#,我可以原谅你不知道指针算术,因为你很可能不会使用它,而且很可能不应该使用它。 但是即使在托管的 C# 世界中,指针也存在于我们周围。

            string s = "abc"  
            int a = 3;
            

            这两个变量之一,实际上是一个指针(引用。随便。同样的东西)。哪一个?老实说,一个不懂这一点的人需要用一年的时间去找一份工作,之后他肯定会明白这一点。

            想象一下这个家伙必须编写一个接受 ref 字符串的函数。它是:

            1. 不可变。
            2. 对不可变对象的引用。
            3. 对不可变对象的引用的引用。 (不变性与指针无关。如果它是不可变的,那就更令人困惑了^^)

            如果他没有事先在 C 语言中失去指针童贞,这个人会发疯的试图弄清楚这一点。或者更糟糕的是,想象你的代码的某个关键部分使用了一个包含类中一些有价值信息的字典,而这个人改变了它的一个值,这会改变对象的 GetHashValue,并导致你“丢失”实例。

            即使理智的 C# 开发人员不在他们的代码中使用显式指针,这并不意味着没有隐式使用指针。

            每个优秀的程序员都需要准确地理解他们的语言抽象掉了什么,否则他将永远无法正确理解该语言。要正确地做 C#,您需要了解 C,而要正确地做 C,您需要了解汇编程序。

            另外,你的问题 - 据你所知,你的受访者认为 myObject 是一个结构。他很可能没有,但仍然如此。
            编辑:是的,引用不是固定的,不像指针。但从概念上来说确实没有区别。

            【讨论】:

              【解决方案10】:

              通过该问题并不能说明某人的能力,但失败却说明了该人缺乏能力。了解引用与值语义是了解如何编程的基础。

              如果某人对程序的行为方式有错误的mental model,那么他最多只能进行“意外编程”。当出现问题时,他将无法找出出现问题的原因。

              【讨论】:

                【解决方案11】:

                老实说,大约 2 个月前,我从全套 Microsoft 课程中毕业。诚然,我编程的时间比这更长,但我想说在 C# 中我已经用了大约 2 年了。

                我知道一个事实,这些问题在我的学习过程中出现了好几次,而且班里的每个人都知道这一点绝对是 100% 的关键。事实上,我认为微软考试甚至有一些混合在一起。

                站在学生的角度(虽然是高水平的学生),大家应该都知道。如果他们不这样做,那么他们就没有足够的核心编程(或逻辑)知识,无法在编程中走得更远。

                顺便说一句,我现在的工作在第二次面试中有一个小测试。他们让我编写了一个应用程序来测试素数、阶乘、编写我自己的 LastIndexOf 和另一个我想不起来的应用程序。

                我认为逻辑在编程中是最重要的。而不仅仅是了解 C# 语言,这更像是一个逻辑问题。

                【讨论】:

                  【解决方案12】:

                  对于任何有 C# 经验的人来说,这不是一个好兆头。

                  除非候选人只是学习这门语言,而且看起来非常聪明,否则对我来说,这几乎是一个交易破坏者。

                  至少,像这样的知识缺口会告诉我需要大量的指导。

                  【讨论】:

                    【解决方案13】:

                    我们有一份在面试过程中向所有开发人员候选人提出的技术问题列表。在这些问题中,必须正确回答一定数量的候选人才能被考虑,理解 C# 参考将是其中一个问题。

                    【讨论】:

                      猜你喜欢
                      • 1970-01-01
                      • 1970-01-01
                      • 2014-09-29
                      • 1970-01-01
                      • 1970-01-01
                      • 1970-01-01
                      • 1970-01-01
                      • 2010-11-13
                      相关资源
                      最近更新 更多