C-sharp(一)

HelloWorld

IDE:VS2019

控制台应用:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace _01ConsoleApp1
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine("hello,world!");
Console.ReadKey();
}
}
}

Windows窗体应用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace _02WindowsFormsApp1
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}

private void Form1_Load(object sender, EventArgs e)
{

}

private void button1_Click(object sender, EventArgs e)
{
MessageBox.Show("hello,world!");
}
}
}

ASP.NET Core Web应用程序

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Http;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;

namespace _03WebApplication1
{
public class Startup
{
// This method gets called by the runtime. Use this method to add services to the container.
// For more information on how to configure your application, visit https://go.microsoft.com/fwlink/?LinkID=398940
public void ConfigureServices(IServiceCollection services)
{
}

// This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}

app.UseRouting();

app.UseEndpoints(endpoints =>
{
endpoints.MapGet("/", async context =>
{
await context.Response.WriteAsync("Hello World!");
});
});
}
}
}

标识符、关键字和数据类型

标识符

C#标识符命名规则:

  • 标识符以字母或下划线_开头,后面跟字母数字组合
  • 标识符不能和关键字同名
  • @符号开头,允许使用关键字作为标识符,但@符号并非标识符的一部分

命名规范(良好编程习惯):

  • 命名要见名知意
  • 变量名用小驼峰命名(第一个单词首字母小写,后面的单词首字母大写),如myName
  • 方法名和类名用大驼峰命名(所以单词首字母均大写),如String、GetMyName
  • 常量的每个字母均大写,如PI

关键字

C#中的关键字,又称保留字,是C#语言中已经被赋予特定意义的一些单词。

C# Keywords

数据类型

C# 数据类型(注意:C#禁止在安全代码中使用指针,文章也说了“我们将在章节"不安全的代码"中讨论指针类型。 ”)

  • 值类型:数据长度固定,存放于栈内存中
  • 引用类型:数据长度可变,存放于堆内存中

值类型

简单类型:

  • 整数类型
  • 浮点数类型
  • 小数类型(decimal,用于有高精度需要的财务和金融计算领域,小数类型要使用m或M作为后缀)
  • 布尔类型(true和false)
  • 字符类型(char,用来存储Unicode字符集中的字符,是一种特殊的整数类型。字符型数据使用单引号引用)

结构类型:

例子:

1
2
3
4
5
6
struct student
{
public string name;
public uint age;
public bool sex;
}

上述代码定义了一个名为student的结构类型数据

  • 结构类型包含的成员类型没有限制
  • 可以将一个结构类型作为另一个结构类型的成员类型,即所谓的结构嵌套

(结构类型可以完成的功能,类也同样可以完成)

结构类型的好处:

  • 使用栈,效率较高
  • 使用后能够自动释放内存
  • 容易复制

枚举类型:

例子:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Chapter02
{
class Program
{
// 声明枚举类型
enum Days { Sum, Mon, Tue, Wed, Thu, Fri, Sat };
static void Main(string[] args)
{
//变量类型 变量名称 = 值;
//int n = 10;
Days days = Days.Wed;
int x = (int)Days.Fri;
Console.WriteLine("day={0},Fri的序号为{1}", days, x);
Console.ReadKey();
}
}
}
  • 枚举类型中的元素默认类型为int,默认第一个元素序号是0,后面依次+1
  • 如果某个枚举值被直接赋予特定序号值,则后面枚举值的序号值从前面特定的序号值开始递增
  • 枚举类型元素的类型可以是8种整形中的任何一种

引用类型

引用类型不包含存储在变量中的实际数据,但它们包含对变量的引用。

换句话说,它们指的是一个内存位置。使用多个变量时,引用类型可以指向一个内存位置。如果内存位置的数据是由一个变量改变的,其他变量会自动反映这种值的变化。内置的 引用类型有:objectdynamicstring

引用类型:类,接口,数组,字符串。引用类型后续会继续学习。

类型转换、变量与常量

类型转换

相关文章

C#中类型转换分为隐式类型转换和显式类型转换

  • 隐式转换:是系统默认的转换,不需要特别额外的声明,因此又称为自动转换

    ​ 转换原则:小数值范围类型可以隐式转换为大数值范围类型(注意:C#语言不允许数值类型隐式转换成char类型)

  • 显示转换:当需要将数据从一种数据类型转换成另一种类型,而这种转换又不符合隐式转换规则时,就需要明确地告诉编译器进行转换,又称为强制转换

    ​ 转换原则:大数值范围类型可以显式转换为小数值范围类型

    • 显示转换可能导致错误(比如说溢出错误)
    • 将浮点数转换为整数,结果只保留整数部分,小数部分舍弃
    • double到float的转换,通过舍入取得最接近的float值
    • decimal到float和double的转换会降低精度,但不会引起错误,因为decimal类型的描述范围小于float和double

装箱和拆箱

相关文章:C#装箱和拆箱(Boxing 和 UnBoxing)装箱和取消装箱(C# 编程指南)

装箱(boxing):

  • 值类型隐式地转换成object类型或任何该值类型所执行的接口类型
  • 装箱的实质是数据在内存中存储方式发生了改变

拆箱(unboxing)

  • 将object类型显式地转换成值类型或者把任意接口类型转换成一个执行该接口的值类型
  • 拆箱是装箱的逆操作,必须进行显式转换,且要保证object对象与目标值类型兼容,否则会产生错误

var类型

var(C#参考)

不确定类型常用于foreach循环语句

变量与常量

变量(可改变),常量(不可变),C#中变量和常量必须先声明后使用。

变量的声明:

1
【修饰符】 数据类型 变量名 【=变量初始值】;

变量作用域:C#规定变量作用域从变量声明位置开始到所在语句块结束为止。并且在下一语句块中有效。

常量的声明:

1
【修饰符】 const 数据类型 变量名 = 常量名

运算符和表达式

菜鸟教程

例子:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace demo02
{
class Program
{
static void Main(string[] args)
{
//1.算术运算
int s = 4 * 5; // 20
int n = 8 / 5; // 结果为1
int m = 8 % 5; // 结果为3
double dou = 6.0 * 5; // 结果为30.0
Console.WriteLine(s);
Console.WriteLine(n);
Console.WriteLine(m);
Console.WriteLine(dou); // 30
Console.WriteLine("{0:f1}",dou); // 30.0 格式化输出结果
Console.WriteLine(); // 换行

// 2.关系运算
int num1 = 2, num2 = 5;
Console.WriteLine("num1={0},num2={1}", num1, num2);
Console.WriteLine("num1<num2的结果是:{0}", num1 < num2); // 2<5,True
Console.WriteLine("num1>num2的结果是:{0}", num1 > num2); // False
Console.WriteLine("num1==num2的结果是:{0}", num1 == num2); // False
Console.WriteLine("num1<=num2的结果是:{0}", num1 <= num2); // True
Console.WriteLine("num1!=num2的结果是:{0}", num1 != num2); // True
Console.WriteLine(); // 换行

// 3.逻辑运算
int a = 1, b = 2, c = 3, d = 4;
// 声明bool型变量
bool result1 = (a < b) && (c == d); // False
bool result2 = (a < b) || (c == d); // True
Console.WriteLine(result1);
Console.WriteLine(result2);
Console.ReadKey();
}
}
}

程序流程控制

C#中的流程控制:

  • 顺序结构
  • 选择结构
  • 循环结构

顺序结构不用多说,主要看一下C#中的选择结构和循环结构

选择结构

菜鸟教程

if-else例子:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace dmeo03
{
class Program
{
static void Main(string[] args)
{
// 1.简单if语句
// 模拟登陆,用户名root,密码123
// 获取输入信息
Console.WriteLine("请输入用户名");
string name = Console.ReadLine();
Console.WriteLine("请输入密码");
string password = Console.ReadLine();
if (name == "root" && password == "123")
{
Console.WriteLine("登陆成功!");
}
else if(name != "root" && password == "123")
{
Console.WriteLine("用户名错误,登陆失败!");
}
else if (name == "root" && password != "123")
{
Console.WriteLine("密码错误,登陆失败!");
}
else
{
Console.WriteLine("用户名和密码都错误,登陆失败!");
}
Console.ReadLine();
}
}
}

switch例子:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace demo04
{
class Program
{
static void Main(string[] args)
{
string grade;
Console.WriteLine("请输入等级:");
grade = Console.ReadLine();

switch (grade)
{
case "A":
Console.WriteLine("优秀");
break;
case "B":
Console.WriteLine("良好");
break;
case "C":
Console.WriteLine("及格");
break;
case "D":
Console.WriteLine("不及格");
break;
default:
Console.WriteLine("输入等级无效!");
break;
}
Console.ReadLine();
}
}
}

循环结构

菜鸟教程

while循环例子:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace demo05
{
class Program
{
static void Main(string[] args)
{
int i = 3;
while (i > 0)
{
Console.WriteLine("hello,world({0})", i);
i--;
}
Console.ReadLine();
}
}
}

do-while循环例子:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace demo05
{
class Program
{
static void Main(string[] args)
{
int i = 3;
do
{
Console.WriteLine("hello,world({0})", i);
i--;
} while (i > 0);

Console.ReadLine();
}
}
}

for循环例子:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace demo05
{
class Program
{
static void Main(string[] args)
{
for (int i = 0; i < 10; i++)
{
if (i%2==0)
{
Console.WriteLine("{0}是偶数", i);
}
else
{
Console.WriteLine("{0}是奇数", i);
}
}
Console.ReadLine();
}
}
}

for循环快速生成:提示后连续点击两次Tab

foreach循环

C# 也支持 foreach 循环,使用foreach可以迭代数组或者一个集合对象。(类似Java中的增强for循环)

例子:输入一段字符串,统计字符串中小写字母‘a’的出现次数,字符串中出现非字母时停止循环。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace demo05
{
class Program
{
static void Main(string[] args)
{
int num = 0;
Console.WriteLine("请输入字符串:");
string s = Console.ReadLine();
foreach (var item in s)
{
if (item=='a')
{
num++;
}
else if (!Char.IsLetter(item)) // 如果不是字母
{
break;
}
}
Console.WriteLine(num);
Console.ReadLine();
}
}
}

跳转语句continuebreak这里就不多说了。

C#中的跳转语句:

  • break
  • continue
  • goto
  • return