private int myVar;
public int MyVar
{
get { return MyVar; }
}
砰。您的应用崩溃时没有堆栈跟踪。一直都在发生。
(注意大写字母,而不是小写字母。MyVar
myVar
Type.GetType
我见过咬很多人的那个是.他们想知道为什么它适用于他们自己的程序集中的类型,以及某些类型,例如 ,但不适用于 。答案是它只在当前程序集和 中查找。Type.GetType(string)
System.String
System.Windows.Forms.Form
mscorlib
匿名方法
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
}
}
}
答案是,在首次调用迭代器的方法之前,代码源中的代码不会执行。CapitalLetters
MoveNext()
我的脑筋急转弯页面上还有其他一些奇怪的东西。
海森堡观察之窗
如果您正在执行按需加载的事情,这可能会严重咬您,如下所示:
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…事实上,它确实有价值!这是怎么发生的?!_myObj
return _myObj
答案是你的IDE导致它获得一个值,因为你打开了一个“监视”窗口 – 特别是“自动”监视窗口,它显示与当前或上一行执行相关的所有变量/属性的值。当您在第 3 行命中断点时,监视窗口决定您有兴趣了解 的值 – 因此在幕后,忽略您的任何断点,它会为您计算值 – 包括对 CreateMyObj()
的调用来设置_myObj的值!MyObj
MyObj
这就是为什么我称之为海森堡观察窗——你不能在不影响它的情况下观察它的价值……🙂
得了!
编辑 – 我觉得@ChristianHayter的评论值得包含在主要答案中,因为它看起来像是解决此问题的有效解决方法。因此,只要您有一个懒惰加载的属性…
使用 [DebuggerBrowsable(DebuggerBrowsableState.Never)] 或 [DebuggerDisplay(“<按需加载>”)] 装饰您的属性。– 克里斯蒂安·海特
模板简介:该模板名称为【C# 为什么它适用于他们自己的程序集中的类型】,大小是暂无信息,文档格式为.编程语言,推荐使用Sublime/Dreamweaver/HBuilder打开,作品中的图片,文字等数据均可修改,图片请在作品中选中图片替换即可,文字修改直接点击文字修改即可,您也可以新增或修改作品中的内容,该模板来自用户分享,如有侵权行为请联系网站客服处理。欢迎来懒人模板【C#】栏目查找您需要的精美模板。