一个很好的熟人和过去的同事突然打电话给我,并给了我一份我真的不能忽视的合同.他确信我会很好地完成并立刻获得c#(过去的经验在 - > c/c ++/PHP/Python/Lua).
这个问题符合我的另外两个问题:
一般的PHP地雷
Python 2.x陷阱和地雷
你期望人们到底在这里回答什么?
在学习C#时,你可以绊倒所有的东西?说实话,并没有那么多东西.当然,存在与C,C++,Java和Javascript语法的差异,这些语言看起来都像C#,但却截然不同.
但是,您的主要部分将用于学习.NET基类库,而不是C#语言.
编辑#1:请注意,我并不是说在C#和.NET中没有像其他问题那样的"地雷".所有我要说的是,当然,我相信你应该能够根据你所说的过去的经验,快速获得C#.但我也说学习C#并不是你学习经历的最终结果.
您可以轻松了解汽车的手动换档和自动换档系统之间的区别,但实际使用该系统仍需要一些时间.
编辑#2:让我按照您的意图回答您的问题,并添加您可能遇到的典型陷阱.
输入:积极的垃圾收集器.
请考虑以下代码:
using System; using System.Threading; using System.Diagnostics; namespace ConsoleApplication6 { class Program { static void Main(string[] args) { Thread t = new Thread(GCThread); t.IsBackground = true; t.Start(); SomeClass sc = new SomeClass(); sc.Test(); Console.Out.WriteLine("Ending"); } private static void GCThread() { while (true) { GC.Collect(); } } } public class Disposable : IDisposable { public Boolean IsDisposed { get; set; } public void Dispose() { IsDisposed = true; } } public class SomeClass { private Disposable _Collectable = new Disposable(); ~SomeClass() { _Collectable.Dispose(); Console.Out.WriteLine("Finalized"); } public void Test() { Console.Out.WriteLine("Test()"); Disposable c = _Collectable; Debug.Assert(!_Collectable.IsDisposed); Thread.Sleep(100); Console.Out.WriteLine("c.IsDisposed: " + c.IsDisposed); } } }
我的计算机上的对象如下:
Test() Finalized c.IsDisposed: True Ending
在这里,我构造一个SomeClass类型的对象,并调用.Test方法.这个方法现在正在运行(毕竟我调用它),它抓取了一个内部变量_Collectable的副本,然后断言它还没有被处理掉.
但是,在后台,垃圾收集器现在运行(我的后台线程确保GC尽可能频繁地运行),它指示SomeClass自己完成,即使我们的Test方法仍在执行,并且终结器方法处理对象.
因此,即使Debug.Assert确保IsDisposed属性显示为false,在将其输出到控制台时,即使方法仍在运行,该对象也已被释放.
垃圾收集器非常具有攻击性,即使我强迫它在这里尽可能频繁地运行,你仍然无法保证它何时运行.因此,此代码显示了您可以进入的问题类型的示例.
不要认为C#是C++ - 它是一种不同的动物.
学会使用和喜欢GC.期望创建比C++中更多的对象 - 次要临时对象非常常见.你仍然是静态类型的,但是当你开始使用lambdas,匿名类型等时,语言(特别是使用C#3)会感觉更加流畅和灵活.
最重要的是学习和理解.NET框架库.了解它将为您节省大量时间,并帮助您以更"C#"的方式编写代码.如果您需要使用C#让您的代码感到宾至如归的速成课程,请研究Microsoft类库的设计指南.