2016-05-03 154 views
1

我需要将Delphi程序转换为C#,我有'WITH'问题 我找不出适当的转换。任何帮助都会很棒。 我附上了我有麻烦的片段。 QueryLchistory是sql查询,我也删除了while循环内执行的语句。德尔福到C#转换

with QueryLcHistory do begin 
First; 
RemainingMargin := 0; 

    while (not Eof) and Another test Case 
     do begin 
     //Statements #1 
     Next; 
    end; 

    while (not Eof) and Another test Case2 
     do begin 
    // Statements #2 
     Next; 
    end; 
end; {with} 
+1

随着不是一个循环。没有C#等价于。如果你不明白什么意思阅读文档。请在这里请求之前这样做。 –

回答

4

with所做的唯一的事情是在其范围的名称空间中提升其操作数。
这意味着编译器将前缀QueryLcHistory.添加到前缀有效的每个标识符。
这个特殊处理只发生在with语句的begin-end块中,之后它就像往常一样。

由于C#没有with语句,因此您必须首先在Delphi中创建工作代码,而不是先声明with声明,然后才能将其转换为C#代码。

要删除with请按照下列步骤操作。

  1. 与删除,离开开始
    {with QueryLcHistory do} begin

  2. 前缀的每一个标识无论是在with语句。

    QueryLcHistory.First;
    QueryLcHistory.RemainingMargin := 0; //etc

  3. 编译

  4. 删除从那里编译器提供了一个错误的所有标识符QueryLcHistory

  5. 确保新代码的行为与旧代码的行为相同。

现在你已经有了应该很容易转换成C#的简单代码。

随着邪恶
你怎么知道哪些语句由with影响的,哪些不是?
那么除非你记住了QueryLcHistory的完整界面(或者与之相关的任何东西),你不知道。
没有with范围是明确的,在你的脸上。与with它是隐含的和阴险的。切勿使用with,因为很难判断哪些语句在with语句的范围内,哪些语句与其他语句相关。

0

在C#中没有类似于with语句的东西,而在VB中有。

您可以分配这样一个对象的属性:

StringBuilder sb = new StringBuilder() 
    .Append("foo") 
    .Append("bar") 
    .Append("zap"); 

,但你不能把一个,而对象后,反正你可以创建自己的QueryLcHistory的方法,或者你可以简单地之前的任何重复QueryLcHistory适用于它的方法:

Assumning QueryLcHistory作为一个DataTable:

int RemainingMargin = 0; 
DataRow row; 

    IEnumerator e = QueryLcHistory.rows.GetEnumerator(); 

    while (e.MoveNext() && Another test Case) { 
     row = e.Current 
     // Statements #1 
    } 

    while (e.MoveNext() && Another test Case 2) { 
     row = e.Current 
     // Statements #2 
    }