C#.net 3.5中的问题/惊喜

时间:2009-05-20 23:34:36

标签: c# .net

一位熟悉的熟人和过去的同事突然打电话给我,并给了我一份我真的不能忽视的合同。他确信我会很好地完成并立即获得c#(过去的经验在 - > c / c ++ / PHP / Python / Lua)。

这个问题与我的其他两个问题一致:

PHP landmines in general

Python 2.x gotcha’s and landmines

7 个答案:

答案 0 :(得分:7)

您希望人们在这里回答什么?

在学习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,在将其输出到控制台时,即使方法仍在运行,该对象也已被释放。

垃圾收集器非常具有攻击性,即使我强迫它在这里尽可能频繁地运行,你仍然无法保证何时运行。因此,此代码显示了您可以进入的问题类型的示例。

答案 1 :(得分:7)

不要认为C#是C ++ - 它是一种不同的动物。

学会使用和喜爱GC。期望创建比C ++中更多的对象 - 次要临时对象非常常见。你仍然是静态类型的,但是当你开始使用lambdas,匿名类型等时,语言(特别是使用C#3)会感觉更加流畅和灵活。

最重要的是学习和理解.NET框架库。了解它将为您节省大量时间,并帮助您以更“C#”的方式编写代码。如果您需要一个速成课程,让您的代码在C#中有宾至如归的感觉,请研究Microsoft Design Guidelines for Class Libraries

答案 2 :(得分:2)

我认为你会发现更多'陷阱'从c#转向c / c ++。

如果你已经熟悉这些语言,那么你可能只需阅读一本教科书就可以了解c#,但如果你真的遇到任何问题,我会很惊讶。

答案 3 :(得分:2)

了解C#中懒惰和急切评估之间的区别,或者您可能正在调试LINQ查询。这是关于该主题的良好链接:Lazy Evaluation (and in contrast, Eager Evaluation)

答案 4 :(得分:1)

我发现Jon Skeet的“Bluffer指南”很有用:

http://www.yoda.arachsys.com/csharp/

答案 5 :(得分:0)

不要放“;”在课程定义之后!

在C ++中:

class MyClass {


};

在C#中:

class MyClass {


}

答案 6 :(得分:0)

让我感到困惑的主要原因是缺乏复制构造函数以及参考与价值的东西。

查找ICloneable和Jon Skeet to the rescue!

从C ++开始C#很容易。我认为我不忍心回去。