明白了';C#net 3.5中的s/惊喜

明白了';C#net 3.5中的s/惊喜,c#,.net,C#,.net,一位好朋友和过去的同事突然给我打电话,给我提供了一份我真的不能忽视的合同。他确信我很快就能学会c(过去在->c/c++/PHP/Python/Lua中的经验) 这个问题与我的另外两个问题一致: 不要在类定义后加“;” C++中的P>: class MyClass { }; 在C#中: 你希望人们在这里回答什么 当你学习C#时,你可能会遇到的所有问题?说实话,事情并不是那么多。当然,C、C++、java和JavaScript都有语法上的差异,它们看起来都像C语言,但却有很大的不同。 但是,

一位好朋友和过去的同事突然给我打电话,给我提供了一份我真的不能忽视的合同。他确信我很快就能学会c(过去在->c/c++/PHP/Python/Lua中的经验)

这个问题与我的另外两个问题一致:

不要在类定义后加“;”

C++中的P>:

class MyClass {


};
在C#中:


你希望人们在这里回答什么

当你学习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),它获取内部变量_Collectable的一个副本,然后断言它还没有被释放

然而,在后台,垃圾收集器现在运行(我的后台线程确保GC尽可能频繁地运行),它指示SomeClass完成自身,即使我们的测试方法仍在执行,并且终结器方法处理对象

因此,即使Debug.Assert确保IsDisposed属性为false,在将其输出到控制台时,对象也已被释放,即使方法仍在运行

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

< P>不要认为C是C++,它是一种不同的动物。 学会使用并热爱GC。在C++中,希望创建比您以前使用的对象更多的对象——非常小的临时对象。您仍然是静态类型的,但是当您开始使用lambdas、匿名类型等时,该语言(尤其是使用C#3)将感觉更加流畅和灵活


最大的事情将是学习和理解.NETFramework库。了解其中的内容将为您节省最多的时间,还可以帮助您以更“C#”的方式编写代码。如果您需要一个速成班,让您的代码在C#中感觉像在家一样,那么请学习。

我认为您会发现更多的“陷阱”从C#转向C/C++


如果你已经习惯了这些语言,你可能只需要阅读一本教科书来跟上c语言的学习速度,但如果你真的有任何问题,我会感到惊讶。

理解c语言中懒惰和急切的评估之间的区别,否则你可能会在调试LINQ查询时挠头。这里有一个很好的链接:

我发现Jon Skeet的《虚张声势指南》很有用:


让我感到困惑的主要问题是缺少复制构造函数和引用与值的东西

查找iClonable,然后


从C++中,C语言很容易。我想我再也回不去了。

这不是什么会引起bug的事情。。。只是一个编译错误,然后他就会知道。这真的是一个复制品,我同意,我不同意。您链接到的问题的目的是了解技巧和有用的东西。这里的问题是你可能会陷入的已知陷阱。虽然答案在许多方面可能是相同的,但这两个问题的意图对我来说似乎是不同的。我可能做的最糟糕的事情是直接跳到学习一门新语言的技巧上,我的问题的意图是试图保持我的理智,避免任何常见的未记录的意外。
Test()
Finalized
c.IsDisposed: True
Ending