首页 > C# > C# 为什么它适用于他们自己的程序集中的类型

C# 为什么它适用于他们自己的程序集中的类型

上一篇 下一篇

分割线

网友回答:

private int myVar;
public int MyVar
{
    get { return MyVar; }
}

砰。您的应用崩溃时没有堆栈跟踪。一直都在发生。

(注意大写字母,而不是小写字母。MyVarmyVar

分割线

网友回答:

Type.GetType

我见过咬很多人的那个是.他们想知道为什么它适用于他们自己的程序集中的类型,以及某些类型,例如 ,但不适用于 。答案是它只在当前程序集和 中查找。Type.GetType(string)System.StringSystem.Windows.Forms.Formmscorlib


匿名方法

C# 2.0 引入了匿名方法,导致以下令人讨厌的情况:

using System;
using System.Threading;

class Test
{
    static void Main()
    {
        for (int i=0; i < 10; i++)
        {
            ThreadStart ts = delegate { Console.WriteLine(i); };
            new Thread(ts).Start();
        }
    }
}

那会打印出什么?好吧,这完全取决于日程安排。它将打印 10 个数字,但它可能不会打印 0、1、2、3、4、5、6、7、8、9,这是您所期望的。问题是捕获的是变量,而不是创建委托时的值。这可以通过正确范围的额外局部变量轻松解决:i

using System;
using System.Threading;

class Test
{
    static void Main()
    {
        for (int i=0; i < 10; i++)
        {
            int copy = i;
            ThreadStart ts = delegate { Console.WriteLine(copy); };
            new Thread(ts).Start();
        }
    }
}

迭代器块的延迟执行

这个“穷人的单元测试”没有通过——为什么不呢?

using System;
using System.Collections.Generic;
using System.Diagnostics;

class Test
{
    static IEnumerable<char> CapitalLetters(string input)
    {
        if (input == null)
        {
            throw new ArgumentNullException(input);
        }
        foreach (char c in input)
        {
            yield return char.ToUpper(c);
        }
    }
    
    static void Main()
    {
        // Test that null input is handled correctly
        try
        {
            CapitalLetters(null);
            Console.WriteLine("An exception should have been thrown!");
        }
        catch (ArgumentNullException)
        {
            // Expected
        }
    }
}

答案是,在首次调用迭代器的方法之前,代码源中的代码不会执行。CapitalLettersMoveNext()

我的脑筋急转弯页面上还有其他一些奇怪的东西。

分割线

网友回答:

海森堡观察之窗

如果您正在执行按需加载的事情,这可能会严重咬您,如下所示:

private MyClass _myObj;
public MyClass MyObj {
  get {
    if (_myObj == null)
      _myObj = CreateMyObj(); // some other code to create my object
    return _myObj;
  }
}

现在,假设您在其他地方有一些代码使用它:

// blah
// blah
MyObj.DoStuff(); // Line 3
// blah

现在,您要调试方法。因此,您在上面的第 3 行放置了一个断点,打算单步执行代码。为了更好地衡量,您还在上面的行上放置了一个断点,甚至在其内部放置了一个断点。CreateMyObj()_myObj = CreateMyObj();CreateMyObj()

代码在第 3 行命中断点。单步执行代码。您希望输入条件代码,因为显然为空,对吗?呃。。。所以。。。为什么跳过条件直接去?!您将鼠标悬停在_myObj…事实上,它确实有价值!这是怎么发生的?!_myObjreturn _myObj

答案是你的IDE导致它获得一个值,因为你打开了一个“监视”窗口 – 特别是“自动”监视窗口,它显示与当前或上一行执行相关的所有变量/属性的值。当您在第 3 行命中断点时,监视窗口决定您有兴趣了解 的值 – 因此在幕后,忽略您的任何断点,它会为您计算值 – 包括对 CreateMyObj() 的调用来设置_myObj的值!MyObjMyObj

这就是为什么我称之为海森堡观察窗——你不能在不影响它的情况下观察它的价值……🙂

得了!


编辑 – 我觉得@ChristianHayter的评论值得包含在主要答案中,因为它看起来像是解决此问题的有效解决方法。因此,只要您有一个懒惰加载的属性…

使用 [DebuggerBrowsable(DebuggerBrowsableState.Never)] 或 [DebuggerDisplay(“<按需加载>”)] 装饰您的属性。– 克里斯蒂安·海特

模板简介:该模板名称为【C# 为什么它适用于他们自己的程序集中的类型】,大小是暂无信息,文档格式为.编程语言,推荐使用Sublime/Dreamweaver/HBuilder打开,作品中的图片,文字等数据均可修改,图片请在作品中选中图片替换即可,文字修改直接点击文字修改即可,您也可以新增或修改作品中的内容,该模板来自用户分享,如有侵权行为请联系网站客服处理。欢迎来懒人模板【C#】栏目查找您需要的精美模板。

相关搜索
  • 下载密码 lanrenmb
  • 下载次数 198次
  • 使用软件 Sublime/Dreamweaver/HBuilder
  • 文件格式 编程语言
  • 文件大小 暂无信息
  • 上传时间 04-13
  • 作者 网友投稿
  • 肖像权 人物画像及字体仅供参考
栏目分类 更多 >
热门推荐 更多 >
微信素材 微信模板 html5 微信文章 自适应 微信图片 企业网站 响应式 微信公众平台 单页式简历模板
您可能会喜欢的其他模板