ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
要查看帮助文档,可以选中相关词,直接按 F1,就可以启用帮助文档了。 # 程序基本结构 ![](https://ws2.sinaimg.cn/large/006tKfTcly1fr1ghetps8j31kw0w0kjm.jpg) # 常用关键字 ![](https://box.kancloud.cn/9a73a4a25e41250663672673e184d3a0_658x302.png) # 代码编写规范 ![](https://box.kancloud.cn/054d1f23cae82aa4bd2a0ff2b7f19d34_567x362.png) # 命名规范 ![](https://box.kancloud.cn/b62c8b69fd4c6fae7718ad0d270fb0d2_668x298.png) w3c参考教程: https://www.w3cschool.cn/csharp/csharp-data-types.html 以及微软教程: 快速入门 https://docs.microsoft.com/zh-cn/dotnet/csharp/quick-starts/ # 与 ROR 对比 1. ror 中把 mvc 分开,但 c#里面把三个部分合并,比较混乱; 2. 每个句子都以 “;” 分号结束;命令语句的大小写非常严格; 3. 变量类型在一开始就指定:`int a = 4`; 意思是 a 类型是整形; ROR中,把类型写在变量后面:`a.to_i = 4`; 4. 在变量后面可以直接跟method,比如`message.ToUpper()`;表示把 message 这个变量里面的字母全部变为大写(用的是 ToUpper() 这个命令);每个 method 后面都必须跟一个括号,括号里面可以直接写变量名称,或者直接不写; 5. c#不像 ror 一样,变量改变了,就默认返回最后的变量值。c#中,可以从上到下打印,如上述例子。变量trimmedmessage名字不变,但引用的`message. xxx` 内容变了。但整体程序执行的时候,仍按从上到下打印一遍。 ![](https://box.kancloud.cn/11fd655cd39f1695c625dae32f2be2e9_438x412.png) 6. 一般在自己定义的类里面,写自己的方法,最后实现的时候,一般在class program(){}这个类当中显示实现。比如在program里面写console.writeline(); console.readline()等,这些真正被看到到最终效果。 hello,world # 输入 hello,world ## 1 方法1: 直接写 ``` using System namespace HelloApplication { class HelloWorld { static void Main(string[] args) { /* my first c# app*/ Console.WriteLine("Hello amy"); Console.ReadKey(); } } } ``` ## 2 方法2: 用变量写 ``` using System namespace HelloApplication { static void Main(string[] agrs) { class HelloWorld { /*my first c# app*/ var name = "amy"; //记得字符型变量要用引号 Console.WriteLine("Hello" + name + "!"); Console.ReadKey; } } } ``` ## 3 方法3: 用字符插入 ``` using System namespace HelloApplication { static void Main(string[] agrs) { class Helloworld { var name = "amy"; Console.WriteLine($"Hello {name}!"); //**$和引号之间不能有空格** } } } ``` ## 4 方法4: 用ToUpper()函数 is a method you can invoke on a string, like the name variable. It will return the same string, converted to uppercase. ``` using System namespace HelloApplication { static void Main(string[] agrs) { class Helloworld { var name = "amy"; Console.WriteLine($"Hello {name.ToUpper()} !"); } } } ``` # 输入字符串集合 https://docs.microsoft.com/zh-cn/dotnet/csharp/how-to/index#strings ``` var names = new List<string> {"amy", "tony", "pony"}; foreach (var name in names) { Console.WriteLine($"Hello {name.ToUpper()}"); } ``` ## 5 空格排版的使用1 ``` string message = "Hello world"; Console.WriteLine($ [ { message} ]); //注意,{}花括号里面的内容,空格多少都不影响,但花括号外面的空格内容对排版有影响。 ``` 显示结果如下: ![](https://ws2.sinaimg.cn/large/006tNc79ly1fnxs1tctybj305h00vmx0.jpg) ## 6 空格排版的使用2 ``` string message = " hello world "; Console.Write($"[{message}]"); string trimmedmessage = message.TrimStart(); Console.WriteLine($"[{trimmedmessage}]"); trimmedmessage = message.TrimEnd(); Console.WriteLine($"[{trimmedmessage}]"); trimmedmessage = message.Trim(); Console.WriteLine ($"[{trimmedmessage}]"); ``` 得到以下情况: ![](https://ws1.sinaimg.cn/large/006tNc79ly1fnxvrav4ekj307u02oq2x.jpg) > **c#不像 ror 一样,变量改变了,就默认返回最后的变量值。c#中,可以从上到下打印,如上述例子。变量trimmedmessage名字不变,但引用的message. xxx 内容变了。但整体程序执行的时候,仍按从上到下打印一遍。** ![](https://box.kancloud.cn/11fd655cd39f1695c625dae32f2be2e9_438x412.png) > **在变量后面可以直接加“.xxx”,比如“message.ToUpper()”,可以直接弄成全部大写。或“message.Replace”可直接替换。“.”点后面的叫“方法 method”。** ## 7 字符替换 ``` string message = "hello"; Console.WriteLine(message); message = message.Replace("hello", "bye"); Console.WriteLine(message); ``` 得到: ![](https://ws3.sinaimg.cn/large/006tNc79ly1fnxvw43m8cj303402p3yd.jpg) ## 8 直接变成全部大写或全部小写: ``` string message = "Hello"; Console.WriteLine(message); Console.WriteLine(message.Toupper()); Console.WriteLine(message.ToLower()); ``` 得到: ![](https://ws1.sinaimg.cn/large/006tNc79ly1fnxw1x2levj302t03jt8l.jpg) ## 9 搜索文本 ``` string message = "You say goodbye, and I say hello"; Console.WriteLine(message.Contains("goodbye")); Console.WriteLine(message.Contains("greetings")); ``` 得到: false true 或者StartWith/EndWith: ``` string message = "you say goodbye and I say hello"; Console.WriteLine(message.StartsWith("you")); Console.WriteLine(message.EndsWith("hello")); ``` 得到: ![](https://ws3.sinaimg.cn/large/006tNc79ly1fnxwem2y1mj3038030t8k.jpg) # 3 数学计算 Math.PI https://docs.microsoft.com/zh-cn/dotnet/api/system.math.pi?view=netframework-4.7.1 # 4 分支和循环 ## 10 while循环 while语句 ``` int counter = 0; //需要在一开始就指定数据类型 while (counter < 10 ) //这里不需要分号,用花括号包起来的命令都不需要再分号。 { Console.WriteLine(counter); counter++; } ``` 得到:0-9 一共10个数。 ![](https://box.kancloud.cn/2b82820264105b1f1b9b53eee4aeb738_97x162.png) 与 ror 对比: ror中,`while...end`语句与 end 配套。`if...elsif...end` 语句也需要 end结尾。 ![](https://ws3.sinaimg.cn/large/006tNc79ly1fnxxnth1w0j30al05rt8r.jpg) ## 11 do...while 循环 do...while语句 ``` int counter = 0; do { Console.WriteLine($"Hello World! The counter is {counter}"); counter++; } while (counter < 10); ``` 与前面 while 语句作用一样。 ## 12 for循环 for 语句 ``` for (int counter = 10; counter < 10; counter++) { Console.WritelLine(counter); } ``` 说明:for 语句第一句是声明变量 counter 以及初始值;第二句是声明变量的执行条件,也就是当counter在小于10的时候,这个 for 循环将一直执行;最后一句是执行了一遍以后的iterator,也就是迭代:当执行了一次 for 循环以后,对变量如何操作,本例中,是将变量counter值加一处理。for 的句子之间用分号隔开。 支持,大家已了解 C# 语言中的 if 语句和循环构造。看看能否编写 C# 代码,计算 1 到 20 中所有可被 3 整除的整数的总和。 下面提供了一些提示: % 运算符可用于获取除法运算的余数。 if 语句中的条件可用于判断是否应将数字计入总和。 for 循环有助于对 1 到 20 中的所有数字重复执行一系列步骤。 ``` int a, sum = 0; for(a = 1; a < 20 ; a++ ) { if (a % 3 == 0) { sum += a; } } Console.WriteLine(sum); ``` 得到: ![](https://ws2.sinaimg.cn/large/006tNc79ly1fny8ya018fj3034029744.jpg) > console.write语句写在 for 循环外面,能得到一个最终值,如果写在 for 语句里面,则得到所有过程值: ![](https://ws4.sinaimg.cn/large/006tNc79ly1fny8zj93baj30830e4aae.jpg) ## 13 public 和 private `public class` 意思就是声明公共类,大家可以存储和读取。 `private class` 就是private 是私有的資料(隱藏資料.保密資料) 意思是除了自己以外,沒有人能存取這段資料,除非你設一個窗口讓它存取,否則沒有人能變更這段資料(只適用該類別的成員函數)。 如果不声明的话,默认的 class 是 internal class。也就是在该专案中是公共类。internal class 只能在本专案中公共,但public class 则可夸专案调用。 ## 14 内插字符串 ``` public class Vegetable { public Vegetable(string name) => Name = name; public string Name { get; } public override string ToString() => Name; } public class Example { public enum Unit { item, pound, ounce, dozen }; public static void Main() { var item = new Vegetable("eggplant"); var date = DateTime.Now; var price = 1.99m; var unit = Unit.item; Console.WriteLine($"On {date}, the price of {item} was {price} per {unit}."); } } ``` # 5 构造函数 在类被实例化的时候调用(即创建类的对象实力的时候),也是类的成员。构造函数名字必须与类的名字一致;没有返回值;默认构造函数五参数,但也可以设定参数,但要一并把无参数的写法一起写进去。 如: ``` class Toy { public Toy(string name) { Console.WriteLine("正在创建{0}玩具." , name); } } ``` 会提示错误,因为构造函数默认无参数,也就是括号里面不能有内容。但如果非要有内容,则改成以下: ``` class Toy() { public Toy() {} // 无参数的构造函数,这部分先写 public Toy(string name) //接下来写我们需要的带参数的构造函数,但一旦有参数以后,就必须有返回值 { Console.WriteLine("正在创建{0}玩具.", name); } Toy thetoy = new Toy(" 小骑车"); // 返回值 } ``` 下面实例 ``` using System; namespace MyApp { public class Test { //构造函数,名称必须与类的名称相同,所以接下来那句 public Test()必须写。 public Test() { System.Diagnostics.Debug.WriteLine("构造函数被调用"); } //析构函数,用来销毁不需要的类实例,以~开头,没有返回值 ~Test() { System.Diagnostics.Debug.WriteLine("析构函数被调用"); } } class Program //默认这部分必须写 { static void Main(string[] args) { Test t = new Test(); } } } ``` # 注意语法中是否有 static。 如果有,则要用string arr 等类后面加点,调用方法,如果没有,则直接用对象名后面加点调用方法。 ![](https://box.kancloud.cn/7be63120697e1c4a68b9e3e72ac218ab_816x382.png) 1.如果是用到类,则需要类名后面加点。比如: ``` string s1, s2; console.writeline(string.compare(s1,s2)) //在 string 这个类后面加点再调用 compare; ``` 2.如果是用方法,则直接用变量名后面加点,直接跟方法。比如: ``` string s1,s2; s1 = "hello"; s2 = "HELLO" comsole.writeline(s1.CcompareTo(s2)) //要用对象名后面加点; ```