Tag: 理论

为什么尾调用优化需要操作码?

所以我之前已经阅读了很多次 ,技术上.NET 确实支持尾调用优化(TCO),因为它有操作码,只有C#不生成它。 我不确定为什么TCO需要操作码或它会做什么。 据我所知,能够进行TCO的要求是递归调用的结果不与当前函数范围中的任何变量组合。 如果你没有那个,那么我没有看到操作码如何阻止你必须保持堆栈框架打开。 如果你有,那么编译器是否总能轻易地将其编译为迭代的东西? 那么操作码有什么意义呢? 显然有些东西我不见了。 在完全可以使用TCO的情况下,不能总是在编译器级别处理,而不是在操作码级别处理? 什么是不能的例子?

部分覆盖子类中的虚拟自动属性

我刚遇到一个理论问题的时候了。 以下代码有效并编译: public class Parent { public virtual object TestProperty { get; set; } } public class Child : Parent { private string _testValue = “Hello World!”; public override object TestProperty { get { return _testValue; } } } public class Consumer { Parent p = new Child(); public Consumer(){ p.TestProperty = 3; } } […]

如何以及何时放弃在C#中使用数组?

我总是被告知,向数组添加元素的方式如下: 创建数组+ 1element的空副本,然后将原始数组中的数据复制到其中,然后加载新元素的新数据 如果这是真的,那么由于内存和CPU利用率的原因,在需要大量元素活动的场景中使用数组是正确的,对吗? 如果是这种情况,你是否应该尽量避免在添加大量元素时尽可能多地使用数组? 你应该使用iStringMap吗? 如果是这样,如果您需要两个以上的维度并且需要添加大量元素添加,会发生什么。 你是刚刚受到性能打击还是应该使用其他东西?

什么时候应该使用字段而不是属性?

当你使用一个字段以及何时在类设计中使用一个属性时,任何人都可以清楚地表达出来吗? 考虑: public string Name; 要么: private string _Name; public string Name { get { return _Name; } set { _Name = value; } } 我意识到第二种方法更加正确和灵活,所以我通常会尝试使用它。 但那为什么我看到人们使用第一种方法呢? 他们只是懒惰,还是有一些特定的情况,这是正确的选择? 这只是一个偏好问题吗?