Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用语言_C#_Using Statement - Fatal编程技术网

C# 使用语言

C# 使用语言,c#,using-statement,C#,Using Statement,不久前,当我实现JavaScript代码生成框架时,我不得不解决一个特定的C设计问题。我提供的一个解决方案是以一种完全不同的方式使用“using”关键字,如果你愿意的话。我把它作为一种语法糖使用,最初它是一种用于构建分层代码结构的语法糖。看起来像这样的东西: CodeBuilder cb = new CodeBuilder(); using(cb.Function("foo")) { // Generate some function code cb.Add(someState

不久前,当我实现JavaScript代码生成框架时,我不得不解决一个特定的C设计问题。我提供的一个解决方案是以一种完全不同的方式使用“using”关键字,如果你愿意的话。我把它作为一种语法糖使用,最初它是一种用于构建分层代码结构的语法糖。看起来像这样的东西:

CodeBuilder cb = new CodeBuilder();

using(cb.Function("foo"))
{
    // Generate some function code
    cb.Add(someStatement);
    cb.Add(someOtherStatement);

    using(cb.While(someCondition))
    {
        cb.Add(someLoopStatement);

        // Generate some more code
    }
}
它之所以能工作是因为函数和While方法返回IDisposable对象,该对象在dispose时通知构建器关闭当前范围。这样的东西对任何需要硬编码的树状结构都是有帮助的

你认为这样的“黑客”有道理吗?因为你可以说,例如在C++中,许多特性如模板和操作符重载会被滥用,并且这种行为受到很多人的关注。另一方面,你可以说,许多现代语言不鼓励这种滥用,并为你提供了具体的、更受限制的特性


当然,我的例子有些深奥,但却是真实的。那么你对具体的黑客行为和整个问题有什么看法?你遇到过类似的困境吗?你能容忍多少虐待?

离题,但看看lambdas有多好:

var codeBuilder = new CodeBuilder();
codeBuilder.DefineFunction("Foo", x =>
{
    codeBuilder.While(condition, y =>
    {
    }
}

离题,但看看lambdas有多漂亮:

var codeBuilder = new CodeBuilder();
codeBuilder.DefineFunction("Foo", x =>
{
    codeBuilder.While(condition, y =>
    {
    }
}

我认为这是Ruby这样的语言所带来的,Ruby拥有更广泛的机制,可以让您在自己的语言中创建语言google for dsl或领域特定语言(如果您想了解更多)。C在这方面不太灵活


我认为以这种方式创建DSL是一件好事。它使代码更具可读性。在C语言中,使用块是DSL的一个有用部分。在这种情况下,我认为有更好的选择。using is的用法这个例子偏离了它最初的目的。这会使读者感到困惑。例如,我更喜欢安东·戈戈列夫(Anton Gogolev)的解决方案。

我认为这是Ruby这样的语言所带来的,Ruby拥有更广泛的机制,可以让您在自己的语言中为dsl创建语言,如果您想了解更多,还可以创建特定于领域的语言。C在这方面不太灵活


我认为以这种方式创建DSL是一件好事。它使代码更具可读性。在C语言中,使用块是DSL的一个有用部分。在这种情况下,我认为有更好的选择。using is的用法这个例子偏离了它最初的目的。这会使读者感到困惑。例如,我更喜欢安东·戈戈列夫的解决方案。

我不会称之为滥用。在我看来更像是一种虚构的RAII技术。人们一直在用这些东西做显示器。

我不认为这是滥用。在我看来更像是一种虚构的RAII技术。人们一直在用这些来做显示器之类的东西。

如果你按照IDisposable最严格的定义来定义,那么这就是滥用。它是用来作为一种方法,通过托管对象以确定性的方式释放本机资源


IDisposable的使用已经发展到基本上可以被任何具有确定生命周期的对象使用。我并不是说这是写的或错的,但这就是有多少API和用户选择使用IDisposable。根据这个定义,这不是滥用

如果你使用IDisposable最严格的定义,那么这就是滥用。它是用来作为一种方法,通过托管对象以确定性的方式释放本机资源


IDisposable的使用已经发展到基本上可以被任何具有确定生命周期的对象使用。我并不是说这是写的或错的,但这就是有多少API和用户选择使用IDisposable。根据这个定义,这不是滥用

>我不认为这是非常糟糕的滥用,但我也不认为它是好的形式,因为你正在为你的维护开发者建立认知墙。using语句意味着某种生命周期管理。这在它的常规用法和稍微定制的用法中都是很好的,比如@heeen对RAII类似物的引用,但是这些情况仍然保持了using语句的精神完好无损

在您的特定案例中,我可能会认为像@Anton Gogolev这样的功能性更强的方法更符合语言的精神,而且更易于维护


至于你的主要问题,我认为每一个这样的黑客最终都必须站在自己的优势上,作为特定情况下特定语言的最佳解决方案。当然,最好的定义是主观的,但在一定程度上,尤其是当预算和进度的外部约束被抛入混合中时,更为温和的方法是唯一合理的答案。但我也不认为它是好的形式,因为你正在建造的认知墙。 维护开发者。using语句意味着某种生命周期管理。这在它的常规用法和稍微定制的用法中都是很好的,比如@heeen对RAII类似物的引用,但是这些情况仍然保持了using语句的精神完好无损

在您的特定案例中,我可能会认为像@Anton Gogolev这样的功能性更强的方法更符合语言的精神,而且更易于维护


至于你的主要问题,我认为每一个这样的黑客最终都必须站在自己的优势上,作为特定情况下特定语言的最佳解决方案。当然,best的定义是主观的,但确实有一些时候,特别是当预算和时间表的外部约束被纳入到混合中时,一个稍微粗糙的方法是唯一合理的答案。

我经常滥用使用块。我认为它们提供了一种定义范围的好方法。我有一系列的对象用于捕获和恢复状态,例如,在可能改变状态的操作期间,组合框或鼠标指针。我还使用它们创建和删除数据库连接

例如:


我经常用积木辱骂。我认为它们提供了一种定义范围的好方法。我有一系列的对象用于捕获和恢复状态,例如,在可能改变状态的操作期间,组合框或鼠标指针。我还使用它们创建和删除数据库连接

例如:


如果cb.Functionname返回的一次性对象是应该在其上添加语句的对象,这会更好。在内部,这个函数生成器通过对CodeBuilder上的私有/内部函数的调用进行传递是很好的,只是对于公共消费者来说,顺序是明确的

只要Dispose实现会使以下代码导致运行时错误

CodeBuilder cb = new CodeBuilder();
var f = cb.Function("foo")
using(function)
{
    // Generate some function code
    f.Add(someStatement);
}
function.Add(something); // this should throw
然后,行为是直观的,相对合理的,正确的使用下面鼓励和防止这种情况发生

CodeBuilder cb = new CodeBuilder();
using(var function = cb.Function("foo"))
{
    // Generate some function code
    function.Add(someStatement);
}
我不得不问,为什么要使用自己的类而不是提供的CodeDomProvider实现。这有很好的理由,值得注意的是,当前的实现缺少许多C3.0特性,但由于您自己没有提到它


编辑:我支持Anoton的建议,使用lamdas。可读性大大提高,您可以选择允许

如果从cb.Functionname返回的一次性对象是应该添加语句的对象,则效果会更好。在内部,这个函数生成器通过对CodeBuilder上的私有/内部函数的调用进行传递是很好的,只是对于公共消费者来说,顺序是明确的

只要Dispose实现会使以下代码导致运行时错误

CodeBuilder cb = new CodeBuilder();
var f = cb.Function("foo")
using(function)
{
    // Generate some function code
    f.Add(someStatement);
}
function.Add(something); // this should throw
然后,行为是直观的,相对合理的,正确的使用下面鼓励和防止这种情况发生

CodeBuilder cb = new CodeBuilder();
using(var function = cb.Function("foo"))
{
    // Generate some function code
    function.Add(someStatement);
}
我不得不问,为什么要使用自己的类而不是提供的CodeDomProvider实现。这有很好的理由,值得注意的是,当前的实现缺少许多C3.0特性,但由于您自己没有提到它


编辑:我支持Anoton的建议,使用lamdas。可读性大大提高,您可以选择允许

nice,我需要更多地了解c3.0nice,我需要更多地了解c3.0