diff --git a/.vscode/settings.json b/.vscode/settings.json
new file mode 100644
index 0000000..9e26dfe
--- /dev/null
+++ b/.vscode/settings.json
@@ -0,0 +1 @@
+{}
\ No newline at end of file
diff --git "a/FirstSteps_ZH-CN/00-\347\233\256\345\275\225.ipynb" "b/FirstSteps_ZH-CN/00-\347\233\256\345\275\225.ipynb"
index ee06ab0..19fb2df 100644
--- "a/FirstSteps_ZH-CN/00-\347\233\256\345\275\225.ipynb"
+++ "b/FirstSteps_ZH-CN/00-\347\233\256\345\275\225.ipynb"
@@ -8,21 +8,23 @@
"\n",
"| 课程 |\n",
"|-----|\n",
- "| [目录 ]( 00-目录.ipynb ) |\n",
+ "| [目录 ]( 00-目录.ipynb ) |\n",
"| [变量的使用 ]( 01-变量的使用.ipynb ) |\n",
"| [什么是字符串 ]( 02-什么是字符串.ipynb ) |\n",
"| [XSharp 中的字符串 ]( 02b-XSharp%20中的字符串.ipynb ) |\n",
- "| [Integers(整数 - 1) ]( 03-Integers(整数%20-%201).ipynb ) |\n",
- "| [Integers(整数 - 2) ]( 04-Integers(整数%20-%202).ipynb ) |\n",
- "| [Decimals(小数) ]( 05-Decimals(小数).ipynb ) |\n",
- "| [条件语句 ]( 06-条件语句.ipynb ) |\n",
- "| [循环语句 ]( 07-循环语句.ipynb ) |\n",
- "| [循环和分支 ]( 08-循环和分支.ipynb ) |\n",
- "| [数组(Array)、列表(Lists)和集合(Collections) ]( 09-数组(Arrays)、列表(Lists)%20和集合(Collections).ipynb ) |\n",
+ "| [Integers(整数 - 1) ]( 03-Integers(整数%20-%201).ipynb ) |\n",
+ "| [Integers(整数 - 2) ]( 04-Integers(整数%20-%202).ipynb ) |\n",
+ "| [Decimals(小数) ]( 05-Decimals(小数).ipynb ) |\n",
+ "| [条件语句 ]( 06-条件语句.ipynb ) |\n",
+ "| [循环语句 ]( 07-循环语句.ipynb ) |\n",
+ "| [循环和分支 ]( 08-循环和分支.ipynb ) |\n",
+ "| [数组(Array)、列表(Lists)和集合(Collections) ]( 09-数组(Arrays)、列表(Lists)%20和集合(Collections).ipynb) |\n",
"| [搜索、排序和管理列表(Lists) ]( 10-搜索、排序和管理列表(Lists).ipynb ) |\n",
- "| [练习使用列表(Lists) ]( 11-练习使用列表(Lists).ipynb ) |\n",
- "| [函数和过程 ]( 12-函数和过程.ipynb ) |\n",
- "| [对象和类 ]( 13-对象和类.ipynb ) |\n",
+ "| [练习使用列表(Lists) ]( 11-练习使用列表(Lists).ipynb ) |\n",
+ "| [函数和过程 ]( 12-函数和过程.ipynb ) |\n",
+ "| [对象和类 ]( 13-对象和类.ipynb ) |\n",
+ "| [方法和成员 ]( 14-方法和成员.ipynb)|\n",
+ "| [方法和异常 ]( 15-方法和异常.ipynb)|\n",
"\n",
"\n",
" \n"
diff --git "a/FirstSteps_ZH-CN/01-\345\217\230\351\207\217\347\232\204\344\275\277\347\224\250.ipynb" "b/FirstSteps_ZH-CN/01-\345\217\230\351\207\217\347\232\204\344\275\277\347\224\250.ipynb"
index 8a11634..733ced9 100644
--- "a/FirstSteps_ZH-CN/01-\345\217\230\351\207\217\347\232\204\344\275\277\347\224\250.ipynb"
+++ "b/FirstSteps_ZH-CN/01-\345\217\230\351\207\217\347\232\204\344\275\277\347\224\250.ipynb"
@@ -9,7 +9,7 @@
},
{
"cell_type": "code",
- "execution_count": null,
+ "execution_count": 1,
"metadata": {
"dotnet_interactive": {
"language": "csharp"
@@ -18,7 +18,25 @@
"kernelName": "csharp"
}
},
- "outputs": [],
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "
"
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "ename": "Error",
+ "evalue": "C:\\Users\\Lenovo\\.packagemanagement\\nuget\\Projects\\27672--7ae3e934-3130-42cb-945e-03efd70eeec3\\Project.fsproj : error NU1301: The local source 'D:\\Program' doesn't exist.",
+ "output_type": "error",
+ "traceback": [
+ "C:\\Users\\Lenovo\\.packagemanagement\\nuget\\Projects\\27672--7ae3e934-3130-42cb-945e-03efd70eeec3\\Project.fsproj : error NU1301: The local source 'D:\\Program' doesn't exist."
+ ]
+ }
+ ],
"source": [
"// <-= 按左侧箭头运行\n",
"#r \"nuget:XSharpInteractive\""
diff --git "a/FirstSteps_ZH-CN/09-\346\225\260\347\273\204(Arrays)\343\200\201\345\210\227\350\241\250(Lists) \345\222\214\351\233\206\345\220\210(Collections).ipynb" "b/FirstSteps_ZH-CN/09-\346\225\260\347\273\204(Arrays)\343\200\201\345\210\227\350\241\250(Lists) \345\222\214\351\233\206\345\220\210(Collections).ipynb"
index 82bfd25..580ef6b 100644
--- "a/FirstSteps_ZH-CN/09-\346\225\260\347\273\204(Arrays)\343\200\201\345\210\227\350\241\250(Lists) \345\222\214\351\233\206\345\220\210(Collections).ipynb"
+++ "b/FirstSteps_ZH-CN/09-\346\225\260\347\273\204(Arrays)\343\200\201\345\210\227\350\241\250(Lists) \345\222\214\351\233\206\345\220\210(Collections).ipynb"
@@ -112,7 +112,7 @@
"\n",
"**XSharp** 中其他方言也支持不同类型的数组和列表。 \n",
"\n",
- "它从 xBase 继承了一种特殊类型,称为 `USUAL`;它是在面向对象编程之前的类型,所以在 `OBJECT` 类型之前。有了它,你可以创建动态数组,其行为有点像 ArrayList,但用于操作它的函数/方法是不同的。 \n",
+ "它从 xBase 继承了一种特殊类型,称为 `USUAL`;它是在面向对象编程之前的类型,所以在 `OBJECT` 类型之前。有了它,你可以创建动态数组,其行为有点像 `ArrayList`,但用于操作它的函数/方法是不同的。 \n",
"\n",
"很不幸,我们暂时无法向你展示这些,因为 **XSharpInteractive** 引擎现仅支持 **Core 方言**,而它不支持 `USUAL` 类型。\n",
"___"
diff --git "a/FirstSteps_ZH-CN/13-\345\257\271\350\261\241\345\222\214\347\261\273.ipynb" "b/FirstSteps_ZH-CN/13-\345\257\271\350\261\241\345\222\214\347\261\273.ipynb"
index 410d8eb..24fec30 100644
--- "a/FirstSteps_ZH-CN/13-\345\257\271\350\261\241\345\222\214\347\261\273.ipynb"
+++ "b/FirstSteps_ZH-CN/13-\345\257\271\350\261\241\345\222\214\347\261\273.ipynb"
@@ -48,7 +48,8 @@
"\n",
"- **对象**: 对象是类的实例。它们拥有实际数据值以及执行类定义的操作的能力。他们*存在*于内存。\n",
"- **方法**: 方法是在类中定义的函数或操作。它们定义了对象的行为。它们可以执行各种操作、处理数据并与其他对象交互。它们通常用动词来标识。\n",
- "- **属性**: 属性也称为属性或字段,是类的数据成员。它们存储与对象相关的特征或数据。它们通常用名词来标识。"
+ "- **属性**: 属性也称为属性或字段,是类的数据成员。它们存储与对象相关的特征或数据。它们通常用名词来标识。 \n",
+ "在 X# 中,\"字段\" 和 \"属性\"并不完全相同,但暂且不论(我们将在 [方法和成员](./14-方法和成员.ipynb) 中予以讨论其区别)。"
]
},
{
@@ -81,7 +82,7 @@
"\n",
"***get*** 可以让你看到变量,***set*** 可以让你更改变量。(对吗?)\n",
"\n",
- "> 在 //Properties 下的 BankAccount 对象中键入以下代码\n",
+ "> 在 //属性 下的 BankAccount 对象中键入以下代码\n",
"\n",
" PUBLIC PROPERTY Number AS STRING AUTO GET SET\n",
" PUBLIC PROPERTY Owner AS STRING AUTO GET SET\n",
diff --git "a/FirstSteps_ZH-CN/14-\346\226\271\346\263\225\345\222\214\346\210\220\345\221\230.ipynb" "b/FirstSteps_ZH-CN/14-\346\226\271\346\263\225\345\222\214\346\210\220\345\221\230.ipynb"
new file mode 100644
index 0000000..0110609
--- /dev/null
+++ "b/FirstSteps_ZH-CN/14-\346\226\271\346\263\225\345\222\214\346\210\220\345\221\230.ipynb"
@@ -0,0 +1,569 @@
+{
+ "cells": [
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "# 加载 *XSharp 语言核心*."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {
+ "dotnet_interactive": {
+ "language": "csharp"
+ },
+ "polyglot_notebook": {
+ "kernelName": "csharp"
+ }
+ },
+ "outputs": [],
+ "source": [
+ "// <-= 点击左侧箭头运行代码\n",
+ "#r \"nuget:XSharpInteractive\""
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "# 方法和成员\n",
+ "\n",
+ "这是我们的银行账户: 它暂时还不能做什么,但可以显示户主和余额。 \n",
+ "目前还不显示其账号。 \n",
+ "\n",
+ "我们还将处理一个事务类,该类已为您添加。\n",
+ "\n",
+ "> 执行每一段代码,看看会显示什么。这就是我们上次完成的结果。"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {
+ "dotnet_interactive": {
+ "language": "xsharp"
+ },
+ "polyglot_notebook": {
+ "kernelName": "xsharp"
+ }
+ },
+ "outputs": [],
+ "source": [
+ "CLASS BankAccount\n",
+ " // Properties (#1)\n",
+ " PUBLIC PROPERTY Number AS STRING AUTO GET SET\n",
+ " PUBLIC PROPERTY Owner AS STRING AUTO GET SET\n",
+ " PUBLIC PROPERTY Balance AS Decimal AUTO GET\n",
+ " \n",
+ " // Constructor (#2)\n",
+ " PUBLIC CONSTRUCTOR( name AS STRING, initialBalance AS DECIMAL )\n",
+ " SELF:Owner := name\n",
+ " SELF:Balance := initialBalance\n",
+ " END CONSTRUCTOR\n",
+ " \n",
+ " // Methods (#4)\n",
+ " PUBLIC METHOD MakeDeposit( amount AS DECIMAL, depositDate AS DateTime, notes AS STRING ) AS VOID\n",
+ "\n",
+ " END METHOD\n",
+ "\n",
+ " PUBLIC METHOD MakeWithdrawal( amount AS DECIMAL, withdrawDate AS DateTime, notes AS STRING ) AS VOID\n",
+ "\n",
+ " END METHOD\n",
+ "END CLASS"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {
+ "dotnet_interactive": {
+ "language": "xsharp"
+ },
+ "polyglot_notebook": {
+ "kernelName": "xsharp"
+ }
+ },
+ "outputs": [],
+ "source": [
+ "var account := BankAccount{ \"Bruce\", 1000 }\n",
+ "? i\"The account number [{account:Number}] belongs to {account:Owner}\"\n",
+ "? i\"It has been created with {account:Balance} Euros.\""
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "## 1 : 账号\n",
+ "\n",
+ "我们需要一个起始号码,用于所有新银行账户的创建,以确保账号的唯一性。\n",
+ "\n",
+ "下面是这个 \"基本 \"号码的代码。它的含义是什么?\n",
+ "\n",
+ "- **PRIVATE**: 这意味着该号码的使用仅限于本类内部。除内部代码外,不可能使用它。\n",
+ "- **STATIC**: 这表示该编号对**所有**`BankAccount`**对象**都是唯一的。如果一个账户更改了它,所有其他账户都会看到更改。这是确保银行账号唯一性的一种方法!一旦一个银行账户使用了它的值,我们就会在这个 \"基数 \"上加 1,下一个创建的账户就会有一个新的编号。 \n",
+ "\n",
+ "> 复制下面的代码并粘贴到 `BankAccount` 类的 // 属性部分。\n",
+ "\n",
+ " PRIVATE STATIC accountBaseNumber := 1234567890 AS INT\n",
+ "\n",
+ "> 复制这部分代码并将其添加到构造函数中。\n",
+ "\n",
+ " SELF:Number := accountBaseNumber:ToString()\n",
+ " accountBaseNumber ++\n",
+ "\n",
+ "> 运行这段代码,看看会发生什么!"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {
+ "dotnet_interactive": {
+ "language": "xsharp"
+ },
+ "polyglot_notebook": {
+ "kernelName": "xsharp"
+ }
+ },
+ "outputs": [],
+ "source": [
+ "CLASS BankAccount\n",
+ " // 属性 (#1)\n",
+ " PUBLIC PROPERTY Number AS STRING AUTO GET SET\n",
+ " PUBLIC PROPERTY Owner AS STRING AUTO GET SET\n",
+ " PUBLIC PROPERTY Balance AS Decimal AUTO GET\n",
+ " // (将第一部分代码粘贴在此!)\n",
+ " \n",
+ " // 构造函数 (#2)\n",
+ " PUBLIC CONSTRUCTOR( name AS STRING, initialBalance AS DECIMAL )\n",
+ " SELF:Owner := name\n",
+ " SELF:Balance := initialBalance\n",
+ " // (将第二部分代码粘贴在此!)\n",
+ " \n",
+ " END CONSTRUCTOR\n",
+ " \n",
+ " // 方法 (#4)\n",
+ " PUBLIC METHOD MakeDeposit( amount AS DECIMAL, depositDate AS DateTime, notes AS STRING ) AS VOID\n",
+ "\n",
+ " END METHOD\n",
+ "\n",
+ " PUBLIC METHOD MakeWithdrawal( amount AS DECIMAL, withdrawDate AS DateTime, notes AS STRING ) AS VOID\n",
+ "\n",
+ " END METHOD\n",
+ "END CLASS"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {
+ "dotnet_interactive": {
+ "language": "xsharp"
+ },
+ "polyglot_notebook": {
+ "kernelName": "xsharp"
+ }
+ },
+ "outputs": [],
+ "source": [
+ "var account := BankAccount{ \"Bruce\", 1000 }\n",
+ "? i\"The account number [{account:Number}] belongs to {account:Owner}\"\n",
+ "? i\"It has been created with {account:Balance} Euros.\""
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "> 嗯.... 尝试多次运行创建代码,并尝试猜测发生了什么......;)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "## 2: Transaction(交易)属性\n",
+ "\n",
+ "下一部分是余额!一种方法是只保留数值。 \n",
+ "然而,另一种方法是创建交易历史。\n",
+ "\n",
+ "为此,您需要创建一个transaction(交易)类,记录一次交易。\n",
+ "\n",
+ "> 在 \"Transaction\"类中粘贴以下属性\n",
+ "\n",
+ " PUBLIC PROPERTY Amount AS DECIMAL AUTO GET\n",
+ " PUBLIC PROPERTY Date AS DateTime AUTO GET\n",
+ " PUBLIC PROPERTY Notes AS STRING AUTO GET\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {
+ "dotnet_interactive": {
+ "language": "xsharp"
+ },
+ "polyglot_notebook": {
+ "kernelName": "xsharp"
+ }
+ },
+ "outputs": [],
+ "source": [
+ "CLASS Transaction\n",
+ " // 属性 (粘贴到这里!)\n",
+ "\n",
+ " // 构造函数\n",
+ "\n",
+ "END CLASS"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "你可以注意到,这些属性只显示为 `GET` :这意味着,除了在 `CONSTRUCTOR` 内部,这些属性都是 *只读* 的。"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "## 3: Transaction 构造函数\n",
+ "\n",
+ "现在,让我们为该类添加一个 `CONSTRUCTOR` 构造函数!\n",
+ "\n",
+ "> 在 `Transaction` 类中添加以下代码。\n",
+ "\n",
+ " PUBLIC CONSTRUCTOR( trAmount AS Decimal, trDate AS DateTime, trNote AS String )\n",
+ " SELF:Amount := trAmount\n",
+ " SELF:Date := trDate\n",
+ " SELF:Notes := trNote\n",
+ " END CONSTRUCTOR"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {
+ "dotnet_interactive": {
+ "language": "xsharp"
+ },
+ "polyglot_notebook": {
+ "kernelName": "xsharp"
+ }
+ },
+ "outputs": [],
+ "source": [
+ "CLASS Transaction\n",
+ " // 属性\n",
+ " PUBLIC PROPERTY Amount AS DECIMAL AUTO GET\n",
+ " PUBLIC PROPERTY Date AS DateTime AUTO GET\n",
+ " PUBLIC PROPERTY Notes AS STRING AUTO GET\n",
+ " \n",
+ " // 构造函数 (粘贴到这里!)\n",
+ "\n",
+ "END CLASS"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "## 4: 添加 `Transaction` 支持\n",
+ "\n",
+ "现在我们有了一个 transaction 类,我们将在银行账户中使用它。 \n",
+ "首先,需要创建一个交易列表。\n",
+ "\n",
+ "> 复制以下代码到属性部分。\n",
+ "\n",
+ " PRIVATE allTransactions := List{} AS List"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {
+ "dotnet_interactive": {
+ "language": "xsharp"
+ },
+ "polyglot_notebook": {
+ "kernelName": "xsharp"
+ }
+ },
+ "outputs": [],
+ "source": [
+ "using System.Collections.Generic\n",
+ "\n",
+ "CLASS BankAccount\n",
+ " // 属性\n",
+ " PUBLIC PROPERTY Number AS STRING AUTO GET SET\n",
+ " PUBLIC PROPERTY Owner AS STRING AUTO GET SET\n",
+ " PUBLIC PROPERTY Balance AS Decimal AUTO GET\n",
+ " PRIVATE STATIC accountBaseNumber := 1234567890 AS INT\n",
+ " // 粘贴到这里\n",
+ " \n",
+ " // 构造函数\n",
+ " PUBLIC CONSTRUCTOR( name AS STRING, initialBalance AS DECIMAL )\n",
+ " SELF:Owner := name\n",
+ " SELF:Balance := initialBalance\n",
+ " SELF:Number := accountBaseNumber:ToString()\n",
+ " accountBaseNumber ++\n",
+ " END CONSTRUCTOR\n",
+ " \n",
+ " // 方法\n",
+ " PUBLIC METHOD MakeDeposit( amount AS DECIMAL, depositDate AS DateTime, notes AS STRING ) AS VOID\n",
+ "\n",
+ " END METHOD\n",
+ "\n",
+ " PUBLIC METHOD MakeWithdrawal( amount AS DECIMAL, withdrawDate AS DateTime, notes AS STRING ) AS VOID\n",
+ "\n",
+ " END METHOD\n",
+ "END CLASS"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "## 5 : 计算`余额`\n",
+ "\n",
+ "既然已经有了可以使用的交易列表,就可以用它来计算余额了。 \n",
+ "您要做的是,每当有人要获取余额时,先检查交易列表并将其全部统计起来,然后再返回答案。 \n",
+ "为此,您可以在余额中的 `GET`中附加一些指令!\n",
+ "\n",
+ " PUBLIC PROPERTY Balance AS Decimal\n",
+ " GET\n",
+ " VAR currentBalance := 0.0M\n",
+ " FOREACH VAR item IN SELF:allTransactions\n",
+ " currentBalance += item:Amount\n",
+ " NEXT\n",
+ " RETURN currentBalance\n",
+ " END GET\n",
+ " END PROPERTY"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {
+ "dotnet_interactive": {
+ "language": "xsharp"
+ },
+ "polyglot_notebook": {
+ "kernelName": "xsharp"
+ }
+ },
+ "outputs": [],
+ "source": [
+ "using System.Collections.Generic\n",
+ "\n",
+ "CLASS BankAccount\n",
+ " // 属性\n",
+ " PUBLIC PROPERTY Number AS STRING AUTO GET SET\n",
+ " PUBLIC PROPERTY Owner AS STRING AUTO GET SET\n",
+ " PUBLIC PROPERTY Balance AS Decimal AUTO GET // 替换这一行\n",
+ " PRIVATE STATIC accountBaseNumber := 1234567890 AS INT\n",
+ " PRIVATE allTransactions := List{} AS List\n",
+ " \n",
+ " // 构造函数\n",
+ " PUBLIC CONSTRUCTOR( name AS STRING, initialBalance AS DECIMAL )\n",
+ " SELF:Owner := name\n",
+ " SELF:Balance := initialBalance\n",
+ " SELF:Number := accountBaseNumber:ToString()\n",
+ " accountBaseNumber ++\n",
+ " END CONSTRUCTOR\n",
+ " \n",
+ " // 方法\n",
+ " PUBLIC METHOD MakeDeposit( amount AS DECIMAL, depositDate AS DateTime, notes AS STRING ) AS VOID\n",
+ "\n",
+ " END METHOD\n",
+ "\n",
+ " PUBLIC METHOD MakeWithdrawal( amount AS DECIMAL, withdrawDate AS DateTime, notes AS STRING ) AS VOID\n",
+ "\n",
+ " END METHOD\n",
+ "END CLASS"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "## 6 : 纠正错误\n",
+ "如果您尝试运行前面的代码块,您可能会发现一个错误: `Balance`不能赋值 - 它是只读的。 \n",
+ "这是你造成的新错误!因为每次获取余额时,都要对交易列表进行汇总,所以不能说余额就是初始余额。本模块不会完全解决这个问题,但可以让代码暂时可用。\n",
+ "\n",
+ "删除 `SELF:Balance := initialBalance`"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {
+ "dotnet_interactive": {
+ "language": "xsharp"
+ },
+ "polyglot_notebook": {
+ "kernelName": "xsharp"
+ }
+ },
+ "outputs": [],
+ "source": [
+ "using System.Collections.Generic\n",
+ "\n",
+ "CLASS BankAccount\n",
+ " // 属性\n",
+ " PUBLIC PROPERTY Number AS STRING AUTO GET SET\n",
+ " PUBLIC PROPERTY Owner AS STRING AUTO GET SET\n",
+ " PUBLIC PROPERTY Balance AS Decimal\n",
+ " GET\n",
+ " VAR currentBalance := 0.0M\n",
+ " FOREACH VAR item IN SELF:allTransactions\n",
+ " currentBalance += item:Amount\n",
+ " NEXT\n",
+ " RETURN currentBalance\n",
+ " END GET\n",
+ " END PROPERTY\n",
+ " PRIVATE STATIC accountBaseNumber := 1234567890 AS INT\n",
+ " PRIVATE allTransactions := List{} AS List\n",
+ " \n",
+ " // 构造函数\n",
+ " PUBLIC CONSTRUCTOR( name AS STRING, initialBalance AS DECIMAL )\n",
+ " SELF:Owner := name\n",
+ " SELF:Balance := initialBalance // 删除这一行\n",
+ " SELF:Number := accountBaseNumber:ToString()\n",
+ " accountBaseNumber ++\n",
+ " END CONSTRUCTOR\n",
+ " \n",
+ " // 方法\n",
+ " PUBLIC METHOD MakeDeposit( amount AS DECIMAL, depositDate AS DateTime, notes AS STRING ) AS VOID\n",
+ "\n",
+ " END METHOD\n",
+ "\n",
+ " PUBLIC METHOD MakeWithdrawal( amount AS DECIMAL, withdrawDate AS DateTime, notes AS STRING ) AS VOID\n",
+ "\n",
+ " END METHOD\n",
+ "END CLASS"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "## 回顾: 初始余额去哪儿了?\n",
+ "下面是这个模块的最终代码。 \n",
+ "不过有一个问题!你不再有初始余额,资金为 0!既然我们用交易绑定了你的余额,我们就需要能够存款和取款,把钱存入银行。我们将在下一个笔记本中看到这一点!\n",
+ "\n",
+ "> 运行下面的代码单元格。\n",
+ "\n",
+ "> 在下一个笔记本之前,请尝试创建自己的交易方法!哪里卡住了?你需要学习什么?"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {
+ "dotnet_interactive": {
+ "language": "xsharp"
+ },
+ "polyglot_notebook": {
+ "kernelName": "xsharp"
+ }
+ },
+ "outputs": [],
+ "source": [
+ "CLASS Transaction\n",
+ " // 属性\n",
+ " PUBLIC PROPERTY Amount AS DECIMAL AUTO GET\n",
+ " PUBLIC PROPERTY Date AS DateTime AUTO GET\n",
+ " PUBLIC PROPERTY Notes AS STRING AUTO GET\n",
+ " \n",
+ " // 构造函数 \n",
+ " PUBLIC CONSTRUCTOR( trAmount AS Decimal, trDate AS DateTime, trNote AS String )\n",
+ " SELF:Amount := trAmount\n",
+ " SELF:Date := trDate\n",
+ " SELF:Notes := trNote\n",
+ " END CONSTRUCTOR\n",
+ "\n",
+ "END CLASS"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {
+ "dotnet_interactive": {
+ "language": "xsharp"
+ },
+ "polyglot_notebook": {
+ "kernelName": "xsharp"
+ }
+ },
+ "outputs": [],
+ "source": [
+ "using System.Collections.Generic\n",
+ "\n",
+ "CLASS BankAccount\n",
+ " // 属性\n",
+ " PUBLIC PROPERTY Number AS STRING AUTO GET SET\n",
+ " PUBLIC PROPERTY Owner AS STRING AUTO GET SET\n",
+ " PUBLIC PROPERTY Balance AS Decimal\n",
+ " GET\n",
+ " VAR currentBalance := 0.0M\n",
+ " FOREACH VAR item IN SELF:allTransactions\n",
+ " currentBalance += item:Amount\n",
+ " NEXT\n",
+ " RETURN currentBalance\n",
+ " END GET\n",
+ " END PROPERTY\n",
+ " PRIVATE STATIC accountBaseNumber := 1234567890 AS INT\n",
+ " PRIVATE allTransactions := List{} AS List\n",
+ " \n",
+ " // 构造函数\n",
+ " PUBLIC CONSTRUCTOR( name AS STRING, initialBalance AS DECIMAL )\n",
+ " SELF:Owner := name\n",
+ " SELF:Number := accountBaseNumber:ToString()\n",
+ " accountBaseNumber ++\n",
+ " END CONSTRUCTOR\n",
+ " \n",
+ " // 方法\n",
+ " PUBLIC METHOD MakeDeposit( amount AS DECIMAL, depositDate AS DateTime, notes AS STRING ) AS VOID\n",
+ "\n",
+ " END METHOD\n",
+ "\n",
+ " PUBLIC METHOD MakeWithdrawal( amount AS DECIMAL, withdrawDate AS DateTime, notes AS STRING ) AS VOID\n",
+ "\n",
+ " END METHOD\n",
+ "END CLASS"
+ ]
+ }
+ ],
+ "metadata": {
+ "kernelspec": {
+ "display_name": ".NET (C#)",
+ "language": "C#",
+ "name": ".net-csharp"
+ },
+ "polyglot_notebook": {
+ "kernelInfo": {
+ "defaultKernelName": "csharp",
+ "items": [
+ {
+ "aliases": [],
+ "languageName": "csharp",
+ "name": "csharp"
+ },
+ {
+ "aliases": [],
+ "languageName": "X#",
+ "name": "xsharp"
+ }
+ ]
+ }
+ }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 2
+}
diff --git "a/FirstSteps_ZH-CN/15-\346\226\271\346\263\225\345\222\214\345\274\202\345\270\270.ipynb" "b/FirstSteps_ZH-CN/15-\346\226\271\346\263\225\345\222\214\345\274\202\345\270\270.ipynb"
new file mode 100644
index 0000000..cba1809
--- /dev/null
+++ "b/FirstSteps_ZH-CN/15-\346\226\271\346\263\225\345\222\214\345\274\202\345\270\270.ipynb"
@@ -0,0 +1,299 @@
+{
+ "cells": [
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "# 加载 *XSharp 语言核心*."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {
+ "dotnet_interactive": {
+ "language": "csharp"
+ },
+ "polyglot_notebook": {
+ "kernelName": "csharp"
+ }
+ },
+ "outputs": [],
+ "source": [
+ "// <-= 点击左侧箭头运行代码\n",
+ "#r \"nuget:XSharpInteractive\""
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "# 方法和异常\n",
+ "\n",
+ "这是我们的银行账户: 它暂时不会做什么,但会显示其所有者和余额。 \n",
+ "\n",
+ "我们还将处理一个 Transaction 类,该类已为您添加。\n",
+ "\n",
+ "> 执行每一段代码,看看会显示什么。这就是我们上次的成果。"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {
+ "dotnet_interactive": {
+ "language": "xsharp"
+ },
+ "polyglot_notebook": {
+ "kernelName": "xsharp"
+ }
+ },
+ "outputs": [],
+ "source": [
+ "CLASS Transaction\n",
+ " // 属性\n",
+ " PUBLIC PROPERTY Amount AS DECIMAL AUTO GET\n",
+ " PUBLIC PROPERTY Date AS DateTime AUTO GET\n",
+ " PUBLIC PROPERTY Notes AS STRING AUTO GET\n",
+ " \n",
+ " // 构造函数 \n",
+ " PUBLIC CONSTRUCTOR( trAmount AS Decimal, trDate AS DateTime, trNote AS String )\n",
+ " SELF:Amount := trAmount\n",
+ " SELF:Date := trDate\n",
+ " SELF:Notes := trNote\n",
+ " END CONSTRUCTOR\n",
+ "\n",
+ "END CLASS"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {
+ "dotnet_interactive": {
+ "language": "xsharp"
+ },
+ "polyglot_notebook": {
+ "kernelName": "xsharp"
+ }
+ },
+ "outputs": [],
+ "source": [
+ "using System.Collections.Generic\n",
+ "\n",
+ "CLASS BankAccount\n",
+ " // 属性\n",
+ " PUBLIC PROPERTY Number AS STRING AUTO GET SET\n",
+ " PUBLIC PROPERTY Owner AS STRING AUTO GET SET\n",
+ " PUBLIC PROPERTY Balance AS Decimal\n",
+ " GET\n",
+ " VAR currentBalance := 0.0M\n",
+ " FOREACH VAR item IN SELF:allTransactions\n",
+ " currentBalance += item:Amount\n",
+ " NEXT\n",
+ " RETURN currentBalance\n",
+ " END GET\n",
+ " END PROPERTY\n",
+ " PRIVATE STATIC accountBaseNumber := 1234567890 AS INT\n",
+ " PRIVATE allTransactions := List{} AS List\n",
+ " \n",
+ " // 构造函数\n",
+ " PUBLIC CONSTRUCTOR( name AS STRING, initialBalance AS DECIMAL )\n",
+ " SELF:Owner := name\n",
+ " SELF:Number := accountBaseNumber:ToString()\n",
+ " accountBaseNumber ++\n",
+ " END CONSTRUCTOR\n",
+ " \n",
+ " // 方法\n",
+ " PUBLIC METHOD MakeDeposit( amount AS DECIMAL, depositDate AS DateTime, notes AS STRING ) AS VOID\n",
+ "\n",
+ " END METHOD\n",
+ "\n",
+ " PUBLIC METHOD MakeWithdrawal( amount AS DECIMAL, withdrawDate AS DateTime, notes AS STRING ) AS VOID\n",
+ "\n",
+ " END METHOD\n",
+ "END CLASS"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {
+ "dotnet_interactive": {
+ "language": "xsharp"
+ },
+ "polyglot_notebook": {
+ "kernelName": "xsharp"
+ }
+ },
+ "outputs": [],
+ "source": [
+ "var account := BankAccount{ \"Bruce\", 1000 }\n",
+ "? i\"The account number [{account:Number}] belongs to {account:Owner}\"\n",
+ "? i\"It has been created with {account:Balance} Euros.\""
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "## 1 : 添加存款\n",
+ "首先要做的是创建存款方式。 \n",
+ "这个新增功能会在交易中加入存款金额、日期和备注,然后将其添加到交易列表中。\n",
+ "\n",
+ "> 在 `MakeDeposit` 中增加.\n",
+ "\n",
+ " var deposit := Transaction{ amount, depositDate, notes }\n",
+ " allTransactions:Add(deposit)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {
+ "dotnet_interactive": {
+ "language": "xsharp"
+ },
+ "polyglot_notebook": {
+ "kernelName": "xsharp"
+ }
+ },
+ "outputs": [],
+ "source": [
+ "using System.Collections.Generic\n",
+ "\n",
+ "CLASS BankAccount\n",
+ " // 属性\n",
+ " PUBLIC PROPERTY Number AS STRING AUTO GET SET\n",
+ " PUBLIC PROPERTY Owner AS STRING AUTO GET SET\n",
+ " PUBLIC PROPERTY Balance AS Decimal\n",
+ " GET\n",
+ " VAR currentBalance := 0.0M\n",
+ " FOREACH VAR item IN SELF:allTransactions\n",
+ " currentBalance += item:Amount\n",
+ " NEXT\n",
+ " RETURN currentBalance\n",
+ " END GET\n",
+ " END PROPERTY\n",
+ " PRIVATE STATIC accountBaseNumber := 1234567890 AS INT\n",
+ " PRIVATE allTransactions := List{} AS List\n",
+ " \n",
+ " // 构造函数\n",
+ " PUBLIC CONSTRUCTOR( name AS STRING, initialBalance AS DECIMAL )\n",
+ " SELF:Owner := name\n",
+ " SELF:Number := accountBaseNumber:ToString()\n",
+ " accountBaseNumber ++\n",
+ " END CONSTRUCTOR\n",
+ " \n",
+ " // 方法\n",
+ " PUBLIC METHOD MakeDeposit( amount AS DECIMAL, depositDate AS DateTime, notes AS STRING ) AS VOID\n",
+ " // 在这里添加代码\n",
+ " END METHOD\n",
+ "\n",
+ " PUBLIC METHOD MakeWithdrawal( amount AS DECIMAL, withdrawDate AS DateTime, notes AS STRING ) AS VOID\n",
+ "\n",
+ " END METHOD\n",
+ "END CLASS"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "## 2 : 异常\n",
+ "\n",
+ "> X# 语言的异常处理功能可帮助您处理程序运行时出现的任何意外或异常情况。 \n",
+ "在许多情况下,异常可能不是由你的代码直接调用的方法抛出的,而是由调用栈中更下面的另一个方法抛出的,也许是在你没有正确使用的外部代码的某个部分,它没有接收到正确的处理信息。 \n",
+ "但是,由于您提供了一些代码来管理银行账户及其交易,因此当出现问题时,您的代码可能会抛出一些异常。\n",
+ "\n",
+ "那么,如果有人试图存入负数资金怎么办? \n",
+ "这说不通,但目前的方法允许这样做。你能做的就是抛出异常。 \n",
+ "在做任何事情之前,先检查存入的金额是否大于 0。如果大于 0,代码就会继续添加交易。如果不是,代码就会抛出异常,停止代码并打印出问题。\n",
+ "\n",
+ "> 将此代码放在 `MakeDeposit` 方法的开头。\n",
+ "\n",
+ " IF (amount <= 0)\n",
+ " THROW ArgumentOutOfRangeException{ nameof(amount), \"Amount of deposit must be positive\" }\n",
+ " ENDIF "
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {
+ "dotnet_interactive": {
+ "language": "xsharp"
+ },
+ "polyglot_notebook": {
+ "kernelName": "xsharp"
+ }
+ },
+ "outputs": [],
+ "source": [
+ "using System.Collections.Generic\n",
+ "\n",
+ "CLASS BankAccount\n",
+ " // 属性\n",
+ " PUBLIC PROPERTY Number AS STRING AUTO GET SET\n",
+ " PUBLIC PROPERTY Owner AS STRING AUTO GET SET\n",
+ " PUBLIC PROPERTY Balance AS Decimal\n",
+ " GET\n",
+ " VAR currentBalance := 0.0M\n",
+ " FOREACH VAR item IN SELF:allTransactions\n",
+ " currentBalance += item:Amount\n",
+ " NEXT\n",
+ " RETURN currentBalance\n",
+ " END GET\n",
+ " END PROPERTY\n",
+ " PRIVATE STATIC accountBaseNumber := 1234567890 AS INT\n",
+ " PRIVATE allTransactions := List{} AS List\n",
+ " \n",
+ " // 构造函数\n",
+ " PUBLIC CONSTRUCTOR( name AS STRING, initialBalance AS DECIMAL )\n",
+ " SELF:Owner := name\n",
+ " SELF:Number := accountBaseNumber:ToString()\n",
+ " accountBaseNumber ++\n",
+ " END CONSTRUCTOR\n",
+ " \n",
+ " // 方法\n",
+ " PUBLIC METHOD MakeDeposit( amount AS DECIMAL, depositDate AS DateTime, notes AS STRING ) AS VOID\n",
+ " // 在这里添加代码\n",
+ "\n",
+ " var deposit := Transaction{ amount, depositDate, notes }\n",
+ " allTransactions:Add(deposit)\n",
+ " END METHOD\n",
+ "\n",
+ " PUBLIC METHOD MakeWithdrawal( amount AS DECIMAL, withdrawDate AS DateTime, notes AS STRING ) AS VOID\n",
+ "\n",
+ " END METHOD\n",
+ "END CLASS"
+ ]
+ }
+ ],
+ "metadata": {
+ "kernelspec": {
+ "display_name": ".NET (C#)",
+ "language": "C#",
+ "name": ".net-csharp"
+ },
+ "polyglot_notebook": {
+ "kernelInfo": {
+ "defaultKernelName": "csharp",
+ "items": [
+ {
+ "aliases": [],
+ "languageName": "csharp",
+ "name": "csharp"
+ },
+ {
+ "aliases": [],
+ "languageName": "X#",
+ "name": "xsharp"
+ }
+ ]
+ }
+ }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 2
+}