C# 从入门到入土(自学笔记)--Day1

目录

学习目标:

C#简介、环境:

C# 一些重要的功能:

C#环境:

开发工具:

C#程序结构:

常用的快捷键:

C#关键字 (C#关键字 | MSDN):

C#数据类型:

值类型:

引用类型:

指针类型:

C#类型转换:

C#变量:

 C#命名规范:

C#常量:

C#运算符:

C#判断:

C#循环:

while、for、foreach、do while、嵌套循环(随便怎么嵌套)

循环控制语句:(经常会问到这三个语句的区别!)

总结:


学习目标:

因为实习了一家IT公司,本来JAVA学的也不好,啥也不会,被骂太多天了,所以自学要求的新语言C#。记录一下学习过程,也欢迎大家监督及修改错误。

学习主要看菜鸟教程C# 教程 | 菜鸟教程,用官方文档辅助C#教程 | Microsoft,,和B站上的刘老师视频C#教程 | 刘铁锰(这个当然是只能回家看)。

要求:

        1. 记录所有概念,以及目前已知的知识(被骂过的经验);

        2. 用VS手敲代码,并贴出。

        3. 每日汇报进度,试图把之前MVC的练习项目完善

        4. 周末同上。


C#简介、环境:

C# 一些重要的功能:

  • 布尔条件(Boolean Conditions)
  • 自动垃圾回收(Automatic Garbage Collection)
  • 标准库(Standard Library)
  • 组件版本(Assembly Versioning)
  • 属性(Properties)和事件(Events)
  • 委托(Delegates)和事件管理(Events Management)
  • 易于使用的泛型(Generics)
  • 索引器(Indexers)
  • 条件编译(Conditional Compilation)
  • 简单的多线程(Multithreading)
  • LINQ 和 Lambda 表达式
  • 集成 Windows

C#环境:

.Net 框架由一个巨大的代码库组成,用于 C# 等客户端语言。下面列出一些 .Net 框架的组件:

  • 公共语言运行库(Common Language Runtime - CLR)
  • .Net 框架类库(.Net Framework Class Library)
  • 公共语言规范(Common Language Specification)
  • 通用类型系统(Common Type System)
  • 元数据(Metadata)和组件(Assemblies)
  • Windows 窗体(Windows Forms)
  • ASP.Net 和 ASP.Net AJAX
  • ADO.Net
  • Windows 工作流基础(Windows Workflow Foundation - WF)
  • Windows 显示基础(Windows Presentation Foundation)
  • Windows 通信基础(Windows Communication Foundation - WCF)
  • LINQ
  • MVC

开发工具:

  • Visual Studio 2019 (VS安装
  • vscode也不是不行(反正这个写前端可舒服了)

C#程序结构:

一个 C# 程序主要包括以下部分:

  • 命名空间声明(Namespace declaration)
  • 一个 class
  • Class 方法
  • Class 属性
  • 一个 Main 方法,是所有 C# 程序的 入口点
  • 语句(Statements)& 表达式(Expressions)
  • 注释

Tips:

  • C# 是大小写敏感的。(命名规范:变量名开头不可以大写,类名一定要大写,命名要见名知义等C#命名规范
  • 所有的语句和表达式必须以分号(;)结尾。
  • 程序的执行从 Main 方法开始。(当然MVC是不一样的)
  • 与 Java 不同的是,文件名可以不同于类的名称。

以hello world为例:

helloworld之前,先创建新项目:这个放到其他文章再写,毕竟要手把手从头开始学。预留链接。

using System;  //相当于Java里的import导包

namespace TestCollection  //命名空间
{
    class Program   //类
    {
        static void Main(string[] args)  //main方法
        {
            Console.WriteLine("Hello World!"); //语句
        }
    }
}

//结果:"Hello World!"  //这是注释


//随便创建一个person类
class Person{     //类
  public string name;  //属性
  public int age;
}

public ActionResult Error(){   //方法
  //方法体
  Console.WriteLine("error"); //语句
}

按F5启动调试,基本上本地都要用Debug模式运(我才不会承认我连这个都不会)。Debug | MSDN


常用的快捷键:

(写的不详细,因为其他没用过,这个文章写的详细,记录一下:VS快捷键大全

Ctrl+Shift+N: 新建项目
 
Ctrl+Shift+O: 打开项目

Ctrl+Shift+S: 全部保存 

Ctrl+Shift+A: 新建项

Shift+Alt+C: 新建类

Ctrl+F: 查找

Ctrl+E,D(ctrl+k,d):格式化全部代码

Ctrl+Alt+L:打开Solution Explorer

调试快捷键:

F5: 启动调试(或者在debug过程中跳过后面的断点直接运行)

Ctrl+F5: 开始执行(不调试)

Shift+F5: 停止调试

Ctrl+Shift+F5: 重启调试

F9: 启用/关闭断点

Ctrl+F9: 停止断点

Ctrl+Shift+F9: 删除全部断点

F10: 逐过程 

Ctrl+F10: 运行到光标处 

F11: 逐语句

F12:点击方法名,可跳转它的定义。

C#关键字 (C#关键字 | MSDN):

常用保留关键字:
abstract
public
private
protected
return
switch
if
else
case
for
foreach
do
while
in
break
continue
try
catch
true
false
byte
float
long
int
string
char
short
void
using
interface
enum
new
namespace
out
ref
null
params

上下文关键字:
add
from
into
join
let
select
set
get
dynamic


C#数据类型:

  • 值类型(Value types)
  • 引用类型(Reference types)
  • 指针类型(Pointer types)

值类型:

        值类型变量可以直接分配给一个值,sizeof()方法可以查看存储尺寸

类型名(关键字)中文意思程序中的描述与用途值的规定范围默认值
bool布尔布尔值True 或 FalseFalse
byte字节8 位无符号整数0 到 2550
char字符16 位 Unicode 字符,如:一个英文字母U +0000 到 U +ffff'\0'
decimal十进位的;小数的128 位精确的十进制值,28-29 有效位数(-7.9 x 1028 到 7.9 x 1028) / 100 到 280.0M
double两倍的;加倍的;64 位双精度浮点型,如:1.3D(+/-)5.0 x 10-324 到 (+/-)1.7 x 103080.0D
float浮动;小数在C#中需要用浮点型表示32 位单精度浮点型,如:1.3F-3.4 x 1038 到 + 3.4 x 10380.0F
int不含分数或小数的数(integer的缩写)32 位有符号整数类型-2,147,483,648 到 2,147,483,6470
long(长度或距离)长的64 位有符号整数类型-9,223,372,036,854,775,808 到 9,223,372,036,854,775,8070L

引用类型:

        直接指向内存地址。内置的引用类型有:object、dynamic 和 string。

声明引用类型: 

内置引用类型:

object对象:所有数据类型的终极基类。当一个值类型转换为对象类型时,则被称为 装箱;另一方面,当一个对象类型转换为值类型时,则被称为 拆箱

Tips:要在运行时成功取消装箱值类型,被取消装箱的项必须是对一个对象的引用,该对象是先前通过装箱该值类型的实例创建的。尝试取消装箱 null 会导致 NullReferenceException。 尝试取消装箱对不兼容值类型的引用会导致 InvalidCastException

int i = 123;      // a value type
object o = i;     // 装箱
int j = (int)o;   // 拆箱

dynamic动态:存储任何类型的值在动态数据类型变量中。对象类型变量的类型检查是在编译时发生的,而动态类型变量的类型检查是在运行时发生的。

string字符串:引号和 @引号

string str = "test";  //记得初始化,暂时没有值可以写,只双引号也可以
string str2 = @"test";
Console.WriteLine(str2);

指针类型:

        指针类型变量存储另一种类型的内存地址

char* cptr;
int* iptr;

C#类型转换:

  • 隐式类型转换:这些转换是 C# 默认的以安全方式进行的转换, 不会导致数据丢失。例如,从小的整数类型转换为大的整数类型,从派生类转换为基类。
  • 显式类型转换:显式类型转换,即强制类型转换。显式转换需要强制转换运算符,而且强制转换会造成数据丢失。大转小。 

案例: 

double d = 5673.74;
int i;

i = (int)d;  //强转
Console.WriteLine(i);

 内置转换方法:随便找个Convert()方法F12一下就能看到全部内置转换方法了。或者输入convert后直接一个“.”,VS会自动生成好多方法的。


    // 概要:
    //     Converts a base data type to another base data type.
    
public static class Convert
    {

        // 概要:
        //     Converts the value of the specified 32-bit signed integer to its equivalent 
        //     string representation.
        //
        // パラメーター(参数):
        //   value:
        //     The 32-bit signed integer to convert.
        //
        // 戻り値(返回值):
        //     The string representation of value.

public static string ToString(int value);

     }

案例:

//转换为字符串类型
int m = 75;
float f = 53.005f;
double n = 2345.7654;
bool b = true;
Console.WriteLine(b.ToString());
Console.WriteLine(n.ToString()); 
Console.WriteLine(f.ToString());
Console.WriteLine(m.ToString());
Console.ReadKey();

C#变量:

类型举例
整数类型sbyte、byte、short、ushort、int、uint、long、ulong 和 char
浮点型float 和 double
十进制类型decimal
布尔类型true 或 false 值,指定的值
空类型可为空值的数据类型
<data_type> <variable_name> = value;

string str;  //定义
int i = 75;  //变量初始化

两种表达式:

lvalue:可以出现在赋值语句的左边或右边。rvalue:可以出现在赋值语句的右边,不能出现在赋值语句的左边。

控制台:

//常用方法:
public static class Console
    {
public static void WriteLine();   //输出
public static ConsoleKeyInfo ReadKey();
public static void Clear();
public static string ReadLine();  //输入
    }


//调用方法:
Console.WriteLine()

 案例:

//接收来自用户的输入,并把它存储到num变量中
int num;
num = Convert.ToInt32(Console.ReadLine());

 C#命名规范

  • Pascal 命名法是指每个单词的首字母大写;Camel 命名法是指第一个单词小写,从第二个单词开始每个单词的首字母大写。
  • 变量的命名规则遵循 Camel 命名法,并尽量使用能描述变量作用的英文单词。例如存放学生姓名的变量可以定义成 name 或者 studentName 等。另外,变量名字也不建议过长, 最好是 1 个单词,最多不超过 3 个单词。


C#常量:

定义常量:
const <data_type> <constant_name> = value;

//案例:
using System;

public class ConstTest
{
    class SampleClass
    {
        public int x;     //定义变量
        public int y;
        public const int c1 = 5;  //定义常量
        public const int c2 = c1 + 5;

        public SampleClass(int p1, int p2)  //方法
        {
            x = p1;
            y = p2;
        }
    }

    static void Main()
    {
        SampleClass mC = new SampleClass(11, 22);  //创建对象
        Console.WriteLine("x = {0}, y = {1}", mC.x, mC.y);  //调用方法
        Console.WriteLine("c1 = {0}, c2 = {1}",
                          SampleClass.c1, SampleClass.c2);
    }
}
//x = 11, y = 22
//c1 = 5, c2 = 10



整数常量:
85         /* 十进制 */
0213       /* 八进制 */
0x4b       /* 十六进制 */
30         /* int */
30u        /* 无符号 int */
30l        /* long */
30ul       /* 无符号 long */

浮点常量:
3.14159       /* 合法 */
314159E-5L    /* 合法 */
510E          /* 非法:不完全指数 */
210f          /* 非法:没有小数或指数 */
.e55          /* 非法:缺少整数或小数 */

字符常量:
class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Hello\tWorld\n\n");
            Console.ReadLine();
        }
    }
//Hello   World


字符串常量:
string a = "hello, world";                // hello, world
string b = @"hello, world";               // hello, world

整数常量:整数常量可以是十进制、八进制或十六进制的常量。前缀指定基数:0x 或 0X 表示十六进制,0 表示八进制,没有前缀则表示十进制。整数常量也可以有后缀,可以是 U 和 L 的组合,其中,U 和 L 分别表示 unsigned 和 long。后缀可以是大写或者小写,多个后缀以任意顺序进行组合(但是不可以重复后缀)。

浮点常量:一个浮点常量是由整数部分、小数点、小数部分和指数部分组成

字符常量:一个普通字符(例如 'x')、一个转义序列(例如 '\t')或者一个通用字符(例如 '\u02C0')。

转义序列(不全)含义
\\\ 字符
\'' 字符
\"" 字符
\?? 字符
\b退格键(Backspace)
\f换页符(Form feed)
\n换行符(Newline)
\r回车
\t水平制表符 tab

字符串常量:括在双引号 "" 里,或者是括在 @"" 里。普通字符、转义序列和通用字符


C#运算符:

  • 算术运算符
  • 关系运算符
  • 逻辑运算符
  • 位运算符
  • 赋值运算符
  • 其他运算符

算术运算符: 

int a = 21;
int b = 20;
int c1,c2,c3,c4,c5,c6,c7,c8,c9;

c1 = a + b;
c2 = a - b;
c3 = a * b;
c4 = a / b;
c5 = a % b;
c6 = ++a;   //先赋值再运算
c7 = a++;   //先运算再赋值
c8 = b--;
c9 = --b;
Console.WriteLine("c的值是 {0},{1},{2},{3},{4},{5},{6},{7},{8}", c1, c2, c3, c4, c5, c6, c7, c8, c9);
//c的值是 41,1,420,1,1,22,22,20,18

关系运算符:

//返回bool类型
==  !=  <  >  <=  >==

逻辑运算符:

//返回bool类型
&& 与  ||或  !非

位运算符:C#运算符 | 菜鸟教程

//实际上是二进制的运算         
int a = 60;  //60 = 00111100
int b = 13;  //13 = 00001101
int c = 0; 

c = a & b;   //同时存在
Console.WriteLine("Line 1 - c 的值是 {0}", c);
c = a | b;   //任意存在
Console.WriteLine("Line 2 - c 的值是 {0}", c);
c = a ^ b;   //异或运算
Console.WriteLine("Line 3 - c 的值是 {0}", c);
c = ~a;      //取反,0变1
Console.WriteLine("Line 4 - c 的值是 {0}", c);
c = a << 2;  //左操作数的值向左移动右操作数指定的位数
Console.WriteLine("Line 5 - c 的值是 {0}", c);
c = a >> 2;  //左操作数的值向右移动右操作数指定的位数
Console.WriteLine("Line 6 - c 的值是 {0}", c);
Console.ReadLine();
                       
            

/*Line 1 - c 的值是 12 = 00001100
Line 2 - c 的值是 61 = 00111101
Line 3 - c 的值是 49 = 00110001
Line 4 - c 的值是 -61 = 11000011
Line 5 - c 的值是 240 = 11110000
Line 6 - c 的值是 15 = 00001111 */

赋值运算符:

=  +=  -=  *=  /=  %=  <<=  >>= &=  ^=  |=
C+=A → C=C+A

其他运算符:


sizeof()返回数据类型大小

typeof()返回class的类型 

&返回变量的实际地址

*变量的指针 

?:三元运算符 

is判断对象是否为某一类型 

as强制转换,失败不报异常


//三元运算符案例
int a, b;
a = 10;
b = (a == 1) ? 20 : 30;  //a是否等于10?等于赋值20给b,不等于30

运算符优先级:后缀>一元>乘除>加减>移位>关系>相等>AND>位或>逻辑>条件>赋值>逗号


C#判断:

//if
//if else案例
public string ResultSelect(string choose)
        {
            string result="";
            if ("cola".Equals(choose))
            {
                result = "顾客选择的是可乐";
            }
            else if ("French_fries".Equals(choose))
            {
                result = "顾客选择的是薯条";
            }
            else if ("Chicken_nuggets".Equals(choose))
            {
                result = "顾客选择的是鸡块";
            }
            else if ("hamburger".Equals(choose))
            {
                result = "顾客选择的是汉堡";
            }
            else if ("popcorn_chicken".Equals(choose))
            {
                result = "顾客选择的是鸡米花";
            }
            else
            {
                result = "不存在";
            }
            return result;
        }

//if嵌套案例
public string ResultCheck(string choose)
        {
            string result ="";        
            string menu ="可乐,薯条,鸡块,汉堡,鸡米花";
            string[] chooses = choose.Split(',');
            //判断字符串在不在其中
            //判断是否为空,不为空再下一步,否则报错
            if (string.IsNullOrWhiteSpace(choose))
            {
                result = "顾客什么都没选择";
            }
            else
            {
                foreach (var item in chooses)
                {
                    //问题:前面的值变了,但是结果会覆盖。解决:用+=先存到字符串中
                    if (menu.Contains(item) != true)
                    {
                        result = "您选择商品不存在!";
                        break;  //到这一步直接跳出循环不继续验证下一个了
                    }
                    else
                    {
                        result = result+ "顾客选择的是" + item+";";

                    }
                    
                }

            }
            return result;
        }


//switch案例:
public string ResultSwitch(string choose)
        {
            string result;
            switch (choose)
            {
                case "1":
                    result = "顾客选择的是可乐";
                    break;

                case "2":
                    result = "顾客选择的是薯条";
                    break;

                case "3":
                    result = "顾客选择的是鸡块";
                    break;

                case "4":
                    result = "顾客选择的是汉堡";
                    break;

                case "5":
                    result = "顾客选择的是鸡米花";
                    break;

                default:
                    result = "不存在";
                    break;
            }
            return result;
        }

//嵌套switch案例
 
    class Program
    {
        static void Main(string[] args)
        {
            int a = 100;
            int b = 200;

            switch (a)
            {
                case 100:
                    Console.WriteLine("这是外部 switch 的一部分");
                    switch (b)
                    {
                        case 200:
                        Console.WriteLine("这是内部 switch 的一部分");
                        break;
                    }
                    break;
            }
            Console.WriteLine("a 的准确值是 {0}", a);
            Console.WriteLine("b 的准确值是 {0}", b);
            Console.ReadLine();
        }
}



//三元运算符
Exp1 ? Exp2 : Exp3;

C#循环:

while、for、foreach、do while、嵌套循环(随便怎么嵌套)

//while循环:while语句中只要条件为真就一直循环。循环可能一次都不会执行。当条件被测试且结果为假时,会跳过循环主体,直接执行紧接着 while 循环的下一条语句。
int a = 10;
while (a < 20)
{
  Console.WriteLine(a);
  a++;
}
Console.ReadLine();


//for循环和foreach循环(菜鸟教程里别人的代码,写的没问题)
using System;
class ForEachTest
{
    static void Main(string[] args)
    {
        int[] fibarray = new int[] { 0, 1, 1, 2, 3, 5, 8, 13 };
        foreach (int element in fibarray)//依次迭代数组内的整型,迭代一次执行一次循环语句
        {
            Console.WriteLine(element);//每次循环需要执行的内容
        }
        Console.WriteLine();


        // 类似 foreach 循环
        for (int i = 0; i < fibarray.Length; i++)//init:循环前首先执行; condition:条件; increment:循环一次后会进入这里,进行其他操作,没有也可以,有分号就行
        {
            Console.WriteLine(fibarray[i]);//输出数组中第i个值
        }
        Console.WriteLine();


        // 设置集合中元素的计算器
        int count = 0;
        foreach (int element in fibarray)  //遍历在fibarray里的所有int元素
        {
            count += 1;
            Console.WriteLine("Element #{0}: {1}", count, element);//count值反映了循环主体的执行次数,从1开始代表了数组中第一个整型,依次往后
        }
        Console.WriteLine("Number of elements in the array: {0}", count);
    }
}

//do while循环:do里面的语句至少会执行一次
class Program
    {
        static void Main(string[] args)
        {
            /* 局部变量定义 */
            int a = 10;

            /* do 循环执行 */
            do
            {
               Console.WriteLine("a 的值: {0}", a);
                a = a + 1;
            } while (a < 20);

            Console.ReadLine();
        }
    }

案例:查找2到100内的质数。

//for循环嵌套:查找2到100内的质数:一个大于1的自然数,除了1和它自身外,不能被其他自然数整除的数
            int i ;
            int j ;
            for (i = 2; i < 100; i++)
            {
                for (j = 2; j <= (i / j); j++) //i=2时,要把j从2到100都遍历一遍才会进入i=3,以此类推直到把i到100全遍历完全
                {
                    if ((i % j) == 0)
                    {
                        break;
                    }
                }
                if (j > (i / j))
                {
                    Console.WriteLine(i);
                }
            }
            Console.ReadLine();

无限循环:

//建议不要随便用无限循环说不定电脑会卡死
 for (; ; )
            {
                Console.WriteLine("Hey! I am Trapped");
            }

循环控制语句:(经常会问到这三个语句的区别!)

break:

  1. 跳出当前所有循环语句,继续执行紧接着循环的下一条语句。

  2. 用于终止 switch 语句中的一个 case。(必须有)

continue:中止本次循环,接着开始下一次循环

return:return后跳出函数,后面的语句也不再执行。


Day1结束

碎碎叨叨一些:

虽然说这是不管学什么语言都会有的一些基础知识,看似简单,实则用起来有非常多的注意点。最近被骂的有点多,不仅是因为没有学好Java等,还有代码量太少,遇到情况不知道该如何解决,自己也知道哪哪都是问题。在过去几周的实习中我才慢慢开始理解面向对象,组件封装等等一系列思维,才慢慢理解代码的意义,出现问题我该如何解决。知道这条路还有很长要走,不能肯定几年后我还在敲代码(说不定实习单位把我送走以后就不干IT了),只是目前赶鸭子上架,我也想尽可能别拖后腿。

总结:

基本语法:关键字,程序结构

数据类型:值类型(bool,char,int...),引用类型(object,dynamic,string),指针类型

类型转换:显式、隐式、内置方法(Convert)

变量:变量命名,初始化

常量:整数、浮点、字符、字符串常量

运算符:算术、关系、逻辑、位、赋值、其它运算符

判断:if、if else、switch、三元运算

循环:while、for、foreach、do while、无限循环

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值