是否有类似于MS-DOS BASIC指令的数据、恢复和读取指令



我对C#有点陌生,我正在尝试编写代码,嵌入一个数据永远不会更改的表。是否有类似于MS-DOS BASIC指令的数据、恢复和读取指令?请看一下我贴在下面的方块。。。

1170 '
1180 ' Error trapping routine.
1190 '
1200 EN=ERR:EL=ERL:' error number:error line.
1210 IF EN=53 AND EL=460 THEN RESUME 480
1220 IF EN=53 THEN EXIST=0:RESUME 880
1230 SCREEN 0:PRINT
1240 RESTORE 1470:' Error data
1250 FOR MYERR=1 TO 35
1260 READ ERNUM,ERTYPE$
1270 IF ERNUM=EN THEN 1290
1280 NEXT
1290 PRINT "Error #"EN"("ERTYPE$") in line"EL
1300 PRINT:LIST 510-610
1310 '
1440 '
1450 ' Error listing.
1460 '
1470 DATA 2,A sintaxis error has been found
1480 DATA 3,Path not found
1490 DATA 4,There is no more data
1500 DATA 5,An Illegal function call has been found
1510 DATA 6,An overflow error has occurred
1520 DATA 7,Not enought memory!
1530 DATA 8,Undefined line number
1540 DATA 9,Index out of range
1550 DATA 11,Division by zero error
.
.
.

DATA语句定义了一个"表";然后对其进行迭代:CCD_;迭代器";,并且CCD_ 3取消引用迭代器并且将其前进到下一项。从本质上讲,这是一个关键价值观;字典";,您可以使用C#的Dictionary容器:

using System;
using System.IO;
using System.Collections.Generic;

public class Program
{
Dictionary<int, string> errors = new Dictionary<int, string>() {
[2] = "A syntax error has been found",
[3] = "Path not found",
[4] = "There is no more data" // etc.
};

如果你真的需要这样一本字典,你会这样做。C#提供了强大的错误诊断功能,您不需要手动管理错误消息字典。这些错误被称为异常,异常可以被捕获,它们传递的信息比大多数BASIC中的信息多得多。

以下是处理文件打开失败的错误的最接近的等效代码:

void someMethod() {
object stream;
try {
// Presumed equivalent of line 460
stream = File.Open("path", FileMode.Open, FileAccess.Read);
// Line 470 would be here
} catch (FileNotFoundException) {} // if the file didn't open, we just continue
// Line 480 onwards would be here
}

以下是如何处理任意错误,不仅提供它们的描述,还提供堆栈跟踪,显示抛出异常时当前线程中所有活动的方法(即已进入但未退出(:

void doAndCatchErrors() {
try {
someMethod();
} catch (Exception e) {
Console.WriteLine("Error: {1}nStack trace:n{2}", e.ToString(), e.StackTrace.ToString());
}
}
};

C#有点像Java,因为它不支持自由函数:所有函数都必须是类中的方法。它们可能是静态函数,然后它们的作用与自由函数完全一样,但通过这种方式,您必须在非全局命名空间中定位它们。全局作用域函数不可伸缩,因为在大型项目中,您会不断地与名称冲突作斗争。想象一下,一个有几千个免费函数的项目——你可以在相当简单的项目中访问这么多函数,其中一些函数确实有重复的名称,但每个名称都在一个单独的类中,因此它们不会冲突。

现在有一个更一般的注意事项:BASIC程序的结构与一个好的、可读的C#程序类似,并使用类似的习语,这是极为罕见的。毕竟,这些都是独立的编程语言,用BASIC表达想法的最常见、最易懂、最惯用的方式很可能会非常笨拙,在C#中显得很陌生。即使是";"端口";当你用C#重新表达它们时,来自BASIC的代码不应该真的像原始代码,因为这两种语言的词汇表在范围上完全不同:现代C#比任何BASIC都更具表达能力,我在这里一点也不夸张。必须在BASIC中从头开始实现的数据结构和操作很可能会在你的C#程序的目标框架中找到(对于现代东西来说,这将是.Net Core框架(——所以我希望任何用C#重写的BASIC程序都会更短、更容易维护、更容易理解,并且可能表现得更好。

试试这样的东西:

object[][] data = new object[][] {
new object[] {2, "A sintaxis error has been found"},
new object[] {3, "Path not found"},
new object[] {4, "There is no more data"},
new object[] {5, "An Illegal function call has been found"},
new object[] {6, "An overflow error has occurred"},
new object[] {7, "Not enought memory!"},
new object[] {8, "Undefined line number"},
new object[] {9, "Index out of range"},
new object[] {11, "Division by zero error"}
};
int en = 1234;
int el = 12;
foreach(object[] d in data)
{
if ((int)d[0] == en)
{
Console.WriteLine("Error #{0} in line {1}", (string)d[1], el); 
}
}

相关内容

  • 没有找到相关文章

最新更新