【问题标题】:Strange execution of get accessor in c#?c#中get访问器的奇怪执行?
【发布时间】:2011-01-09 22:51:57
【问题描述】:

我设置了一个简单的程序来测试 get 访问器中的代码如何执行(因为我在另一个项目中遇到了一些问题),并发现了一些很奇怪的东西:

class Program {
    static void Main(string[] args) {
        var test = new TestClass();
        var testBool = test.TestBool;
    }
}

public class TestClass {
    private bool _testBool = true;
    public bool TestBool {
        get {
            if (_testBool) {
                Console.WriteLine("true!");
            } else {
                Console.WriteLine("false! WTF!");
            }
            _testBool = false;
            return _testBool;
        }
    }
}

我希望输出是

真的!

但我得到的是

真的!

假的!卧槽!

这里到底发生了什么?

【问题讨论】:

  • 您是否在调试器中运行程序?调试器会在你背后调用属性获取器。
  • 为什么删除后又问这个问题?解决方案可能是相同的“IDE 执行访问器,因为它希望它没有副作用”的事情。
  • 从手表中删除 test.TestBool 或在不调试的情况下运行应用程序。
  • (与重复合并;请不要重复发布 - 特别是因为您删除的帖子上已经有两个答案)
  • @Marc Gravell:如果他没有在我提交答案之前删除他的帖子,他会是三个。 :(

标签: c# get


【解决方案1】:

如果我不得不猜测,我会说 调试器 运行一次以显示 IDE 中局部变量的成员。

如果您对属性有副作用(您不应该这样做),请不要在 IDE 中运行它 :)

在控制台试一试;它应该在那里表现自己。

【讨论】:

  • 天哪,在被问到这个问题之前你是怎么回答的? Supermod 问题合并能力?
  • @Ben:提问者之前问过这个问题,然后删除它,然后又问了一遍。 Marc 将已删除的问题与此问题合并。
  • +1 如果我将鼠标悬停在 TestBool 属性上,我只能重现它,这会导致调用 getter。
  • 好的,谢谢你的提示。我需要把它打进去。
  • 删除 dup 问题而不是合并它是有道理的。我打错了:(
【解决方案2】:

没有复制。

并且不要编写带有副作用的 Getter。

【讨论】:

  • +1 表示“不要写有副作用的属性”(因为我不能 +100!)。
  • @Jason:Hank 说得对——只有 getter 不应该有副作用,setter 中的副作用(例如属性通知侦听器)非常好。
  • @Ben:我同意 Henk 的观点。当然,setter 中的预期的、直观的“副作用”是可以的。但程序员自然期望属性是轻量级,因此意外的副作用可能是邪恶的(例如:设置一个属性,而其他看似无关的属性的值发生变化;设置一个属性并且它在重绘一些 UI 并将记录提交到数据库时不会返回 5 秒)。属性可能被严重滥用,并且非常难以调试,尤其是当甚至调试器都假定它们是轻量级的并且单步执行它们,就好像它们是简单的变量一样。跨度>
猜你喜欢
  • 1970-01-01
  • 2022-01-06
  • 1970-01-01
  • 2012-02-25
  • 1970-01-01
  • 2015-08-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多