复杂的C#用于学习目的

时间:2010-08-02 15:29:50

标签: c#

我正在尝试阅读一些其他人的代码,既帮助我学习C#,也纯粹是为了培养我理解其他人代码的能力,但我在网上找到的很多内容都是很长,而且相对简单。我想知道是否有人可以指出一些简短而复杂的东西,最好包括不常用的语言。

(它不需要做任何明智的事情,只要它做了一些事情。完全没有意义的东西,比如XSLT Mandelbrot的C#equivilent,会非常好)

9 个答案:

答案 0 :(得分:4)

Eric Lippert最近在graph colouring on his blog撰写了一系列文章。这可能是让你陷入困境的东西,因为它是一个多部分的系列,应该让你在解释图形着色的过程中从简单到大脑融化的方式工作。 =)

答案 1 :(得分:3)

看看mono source code - 许多BCL课程已经实施,你肯定会学到一些东西:)

还有许多开源.NET项目,这些项目都不是你可以看到的小而简单的应用程序。

以下是我头脑中的一些内容:

答案 2 :(得分:3)

我建议查看Effective C#书籍。它们将帮助您学习更复杂的语言用法。

答案 3 :(得分:2)

结帐Coding4Fun。它是.Net语言的混合,一些(大多数)项目非常酷。 XNA Creators Club也非常酷......很多样本,你有一个XBox360或Zune,你也可以为它们编写游戏。

答案 4 :(得分:2)

来自Luke Hoban博客的

Raytracing in one LINQ statement立刻想到了。

答案 5 :(得分:2)

使用.NET Reflector查看 .NET框架程序集。那里有很多很棒的东西,在我学习的过程中给了我很多帮助。

很多时候我一直在想自己微软是如何在框架中做某些事情的,而且我很容易在其来源中找到答案。

答案 6 :(得分:1)

这个怎么样?

private Element ReadMemberExpression()
{
    var queue = new Queue<Element[]>();
    var newDepth = 0;
    var argsCount = 0;
    _scanner.CreateRestorePoint();
    while (true)
    {
        _scanner.CreateRestorePoint();
        {
            var a = ReadArguments();
            if (a != null)
            {
                argsCount++;
                if (argsCount > newDepth)
                {
                    _scanner.Restore();
                    break;
                }
                queue.Enqueue(new[] { default(Element), default(Element), a });
                _scanner.DeleteRestorePoint();
                continue;
            }
        }
        _scanner.DeleteRestorePoint();

        var pe = ReadPrimaryExpression();
        if (pe != null)
        {
            queue.Enqueue(new[] { pe });
            continue;
        }

        var fe = ReadFunctionExpression();
        if (fe != null)
        {
            queue.Enqueue(new[] { fe });
            continue;
        }

        if (_scanner.MatchNext(Grammar.New))
        {
            newDepth++;
            queue.Enqueue(new[] { Grammar.New });
        }
        else if (_scanner.Match(Grammar.LeftSquareBracket))
        {
            var e = ReadExpression();
            if (e == null)
            {
                throw new ParseException();
            }
            if (!_scanner.MatchNext(Grammar.RightSquareBracket))
            {
                throw new ParseException();
            }
            queue.Enqueue(new[]{default(Element), Grammar.LeftSquareBracket, e, Grammar.RightSquareBracket});
        }
        else if (_scanner.Match(Grammar.FullStop))
        {
            if (!_scanner.MatchNext(ElementType.IdentifierName))
            {
                throw new ParseException();
            }
            queue.Enqueue(new[] { default(Element), Grammar.FullStop, _scanner.Current });
        }
        else
        {
            _scanner.Unwind();
            break;
        }
    }
    if (queue.Count == 0)
    {
        _scanner.DeleteRestorePoint();
        return null;
    }
    else
    {
        var element = default(Element);
        var children = queue.Dequeue();
        while (children[0] == Grammar.New)
        {
            children = queue.Dequeue();
        }
        element = new Element(ElementType.MemberExpression, children);
        while (queue.Count > 0)
        {
            children = queue.Dequeue();
            if (children.Length == 3 && children[2].Type == ElementType.Arguments)
            {
                newDepth--;
                children[0] = Grammar.New;
                children[1] = element;
                element = new Element(ElementType.MemberExpression, children);
            }
            else
            {
                children[0] = element;
                element = new Element(ElementType.MemberExpression, children);
            }
        }
        if (newDepth > 0)
        {
            _scanner.Restore();
            return null;
        }
        _scanner.DeleteRestorePoint();
        return element;
    }
}

答案 7 :(得分:1)

它并不是非常复杂,但可能只是简单的娱乐 - Mads Torgersen在C#中实现了一个定点组合器:

http://blogs.msdn.com/b/madst/archive/2007/05/11/recursive-lambda-expressions.aspx

答案 8 :(得分:0)

这可能是一个明显的建议,但我会查看CodeProject.com上的文章。您可以搜索与C#相关的特定文章,贡献者通常会很好地解释他们的代码。

例如,这里有一篇关于创建Mandelbrot set in C#的文章(虽然这可能没有您想要的那么复杂)。

除此之外,我会在您通过Google找到的C# opensource projects内找到一个高峰。