C#入门学习

开发环境:Visual Studio 2013 Ultimate
跟进课程:刘铁猛《C#语言入门详解》全集

P3 C#语言入门详解003初识类与名称空间

// 创建项目控制台应用程序
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
// using 把命名空间引用到程序中,引用过多可能导致命名空间冲突
// 如果有使用到某函数在上面声明命名空间中就调用该函数

// C#是一种完全面向对象的一种语言,程序本身也被认为是一个类
namespace HelloWorld
{
    internal class Program /*该处浅蓝色高亮的表示类*/
    {
        static void Main(string[] args)
        {
            // 微软实现的Console类,作用是打印内容到输出窗口上
            Console.WriteLine("Hello, World"); // 使用命名空间省略 System.
            System.Console.WriteLine("Hello World");
            System.Console.WriteLine("Hello World "); // 如果不用using的话,得重复写命名空间
        }
    }
}

using System;
using System.Windows.Forms;

namespace HelloWorld
{
    class Program
    {
        static void Main(string[] args)
        {
            // 先有图书馆才能看想看的那本书(类比引入类库)
            // 为显示窗口,引入类库 System.Windows.Forms
            //Form form = new Form();
            //form.ShowDialog(); // 在WSDN文档中查看 ShowDialog() 使用

            // 为实现下面语句,需要手动一个一个的引入多个类库 
            // PresentationFramework、PresentationCore、System.Xml、WindowsBase
            //System.Windows.Window window = new System.Windows.Window();
            //window.ShowDialog();

            // 使用nuget下载EntityFramework,实践下载后还是不能运行,并且上面语句运行报错
            /*“System.InvalidOperationException”类型的未经处理的异常在 PresentationCore.dll 中发生 */

            /* 黑盒引用,
             * 1. 右键引用,添加引用,点击左侧浏览,右下角浏览本地dll文件
             *    双击引用中添加进来的类库可以查看类库中有的
             *    一定要有文档,不然拿到文件基本也不方便用
             */

            /* 白盒引用,
             * 1. 解决方案中添加存在项目MyLibrary
             * 2. 右键引用,添加引用,解决方案,项目,选择上一步相同的项目名称
             */
            //double result = Tools.Calculator.Sub(1, 1); // debug过程通常很长;一定要找到真正的 Root cause!
            //Console.WriteLine(result);

            double result = SuperCalculator.Calculator.Div(3, 0);
            Console.WriteLine(result);
        }
    }
}

在这里插入图片描述

P4 C#语言入门详解004类、对象、类成员

本节内容

  • 类( cass ) 是现实世界事物的模型

  • 类与对象的关系

    • 什么时候叫”对象”什么时候叫“实例’
    • 引用变量与实例的关系
  • 类的三大成员

    • 属性 ( Property )
    • 方法( Method )
    • 事件 ( Event )
  • 类的静态成员与实例成员

    • 关于“绑定”( Binding )
  • 类是对现实世界事物进行抽象所得到的结果

    • 事物包括“物质”(实体)与”运动”( 逻辑 )
    • 建模是一个去伪存真、由表及里的过程
      在这里插入图片描述

类与对象的关系

  • 对象也叫实例,是类经过“实例化”后得到的内存中的实体
    • Formally “instance" is synonymous with “object“ ——对象和实例是一回事
    • “飞机"与“一架飞机”有何区别?天上有(一架)飞机一一必需是实例飞,概念是不能飞的
    • 有些类是不能实例化的,比如”数学”(Math class),我们不能说”一个数学"
  • 依照类,我们可以创建对象,这就是“实例化
    • 现实世界中常称”对象”,程序世界中常称“实例”
    • 二者并无太大区别,常常混用,初学者不必迷惑
  • 使用new操作符创建类的实例
  • 引用变量与实例的关系
    • 孩子与气球
    • 气球不一定有孩子牵着
    • 多个孩子可以使用各自的绳子牵着同一个气球,也可以都通过一根绳子牵着气球

类的三大成员

  • 属性( Property)
    • 存储数据,组合起来表示类或对象当前的状态
  • 方法( Method )
    • 由C语言中的函数(function)进化而来,表示类或对象”能做什么"
    • 工作中90%的时间是在与方法打交道,因为它是”真正做事”、“构成逻辑”的成员
  • 事件( Event )
    • 类或对象通知其它类或对象的机制,为C#所特有(Java通过其它办法实现这个机制)
    • 善用事件机制非常重要
  • 使用MSDN文档
  • 某些特殊类或对象在成员方面侧重点不同
    • 模型类或对象重在属性,如Entity Framework
    • 工具类或对象重在方法,如Math , Console
    • 通知类或对象重在事件,如各种Timer
// 以方法为侧重的类的使用
double x = Math.Pow(2, 3);
Console.WriteLine(x);
// wpf应用程序
using System.Windows.Threading; // 添加命名空间调用声明,多线程

namespace EventSample
{
    /// <summary>
    /// MainWindow.xaml 的交互逻辑
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
            DispatcherTimer timer = new DispatcherTimer(); // 创建类的引用变量
            timer.Interval = TimeSpan.FromSeconds(1); // 间隔多长时间触发事件
            timer.Tick += timer_Tick; // tab tab 键快捷创建响应函数,用 += 操作符挂接函数到事件上
            timer.Start();
        }

        void timer_Tick(object sender, EventArgs e)
        {
            this.timeTextBox.Text = DateTime.Now.ToString();
        }

    }
}

静态成员与实例成员

  • 静态(Static)成员在语义上表示它是“类的成员”
  • 实例(非静态)成员在语义表示它是”对象的成员"
  • 绑定(Binding)指的是编译器如果把一个成员与类或对象关联起来
    • 不可小觑的”."操作符一成员访问

P5 C#语言入门详解005C#语言基本元素概览、初识类型、变量与方法、算法简介

  • 注释和空白会被编译器过滤掉

  • 构成C#语言的基本元素

    • 标记 (Token):对于编译器而言有意义的记号
      • 关键字( Keyword )
      • 操作符( Operator )
      • 标识符( ldentifier )
        • 什么是合法的标识符
          • 怎样阅读语言定义文档
        • 大小写规范
        • 命名规范
      • 标点符号
      • 文本
        • 整数
          • 多种后缀实数
        • 实数
          • 多种后缀字符
        • 字符串
        • 布尔
        • 空( null )
    • 注释与空白
      • 单行
      • 多行( 块注释)
  • 简要介绍类型、变量与方法

  • 算法简介

命名

驼峰式命名法

  • 驼峰式命名法,又叫小驼峰式命名法(所以自然就存在大驼峰命名法啦……)。
  • 该命名规范,要求第一个单词首字母小写,后面其他单词首字母大写,简单粗暴易学易用。
  • EX:int myAge; char myName[10]; float manHeight;

帕斯卡命名法

  • 帕斯卡命名法,又叫大驼峰式命名法。
  • 与小驼峰式命名法的最大区别在于,每个单词的第一个字母都要大写
    • EX:int MyAge; char MyName[10]; float ManHeight;

匈牙利命名法

  • 匈牙利命名法是早期的规范,由微软的一个匈牙利人发明的,是 IDE 还十分智障的年代的产物。那个年代,当代码量很多的时候,想要确定一个变量的类型是很麻烦的,不像现在 IDE 都会给提示,所以才产生了这样一个命名规范,估计现在已经没啥人用了吧……一个十分系统却又琐碎的命名规范。
  • 该命名规范,要求前缀字母用变量类型的缩写,其余部分用变量的英文或英文的缩写,单词第一个字母大写
  • Ex:int iMyAge; # "i": int char cMyName[10]; # "c": char float fManHeight; # "f": float

下划线命名法

  • 下划线命名法并不如大小驼峰式命名法那么备受推崇,但是也是浓墨重彩的一笔。尤其在宏定义和常量中使用比较多,通过下划线来分割全部都是大写的单词。
  • 该命名规范,也是很简单,要求单词与单词之间通过下划线连接即可。
  • Ex:int my_age; char my_name[10]; float man_height;

创建的对象中,写的方法默认私有,不允许外部访问

  • 方法名应该是一个动词或者动词短语

初识类型、变量和方法

  • 初识类型 ( Type )
    • 亦称数据类型( Data Type
  • 变量是存放数据的地方,简称”数据
    • 变量的声明
    • 变量的使用
  • 方法(旧称函数 )是处理数据的逻辑,又称”算法
    • 方法的声明
    • 方法的调用
  • 程序=数据+算法
    • 有了变量和方法就可以写有意义的程序了

P6 详解类型、变量与对象(上)

本节内容

  • 什么是类型
  • 类型在C#语言中的作用
  • C#语言的类型系统
  • 变量、对象与内存

什么是类型( Type )

  • 又名数据类型 ( Data Type )
    • A data type is a homogeneous collection of values, effectively presented, equipped with a set of operations which manipulate these values.
    • 是数据在内存中存储时的“型号”
    • 小内存容纳大尺寸数据会丢失精确度、发生错误
    • 大内存容纳小尺寸数据会导致浪费
    • 编程语言的数据类型与数学的数据类型不完全相同
  • 强类型语言与弱类型语言的比较
    • C语言示例 :if条件
    • JavaScript示例:动态类型 – 变量在运行时代码可以根据某些条件改变自身结构。
    • C#语言对弱类型/动态类型的模仿

在这里插入图片描述

  • 在C语言总能够编译通过,C语言中没有bool类型,混用,非零为true

类型在C#语言中的作用

  • 一个C#类型中所包含的信息有:

    • 存储此类型变量所需的内存空间大小
    • 此类型的值可表示的最大、最小值范围
    • 此类型所包含的成员(如方法、属性、事件等)
    • 此类型由何基类派生而来
    • 程序运行的时候,此类型的变量在分配在内存的什么位置
      • 程序的静态,指数据在硬盘中,比如编译过程
      • 程序的动态,指数据从硬盘加载到内存中,比如调试状态、双击运行
      • Stack简介:在内存中,所占空间比较小,加载速度快
      • Stack overflow
      • Heap简介
      • 使用Performance Monitori查看进程的堆内存使用量
      • 关于内存泄漏
    • 此类型所允许的操作(运算)
  • StackOverFlow

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-bQGtDRxg-1679501240547)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20230318230638463.png)]

栈使用实例

  • 在C#中使用指针(需要开启允许unsafe选项)
    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Y6g5Rf0G-1679501240548)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20230319100834429.png)]
    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5D7Bz52y-1679501240548)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20230319101039196.png)]
    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qHT7XOVF-1679501240549)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20230319101143480.png)]

WPF应用程序,堆使用实例

  • 观察内存使用,windows下的进程监视器

  • cmd> perfmon
    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-yjvOk1ZV-1679501240549)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20230319102748684.png)]

  • 可以用来检查程序是否占用过多内存,或者程序那些操作会占用内存

  • 打开perfmon窗口后,首先 通过❎按钮,取消当前默认监视的系统进程,通过 ➕ 添加需要监视进程
    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-WZzDVlub-1679501240549)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20230319104430656.png)]
    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-98o0bZOb-1679501240550)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20230319104556803.png)]

    List<Window> winList;
    
    private void Button1_Click(object sender, RoutedEventArgs e)
    {
      winList = new List<Window>();
      for(int i = 0; i<15000; i++)
      {
          Window w = new Window();
          winList.Add(w);
      }
    }
    
    private void Button_Click(object sender, RoutedEventArgs e)
    {
      winList.Clear();
    }
    

P7 详解类型、变量与对象(上)

C#语言的类型系统

  • C#的五大数据类型
    • 类(Classes):如Windows, Form, Console, String
    • 结构体(Structures):如lnt32, lnt64, Single, Double
    • 枚举(Enumerations):如HorizontalAlignment, Visibility
    • 接口(Interfaces)
    • 委托(Delegates)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9bUpnI1o-1679501240550)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20230319104833144.png)]

  • 基本类型又称内嵌类型,表示其他类型都由它们构成
  • 所有类型都以Object类型为基类型
  • 蓝色的表示已经存在的实际类型,虚线以下的表示可供用户定义的对应类型,
    • 如object、string表示内嵌的已经创建好的类类型
    • 如引用类型可以通过class创建类类型、interface创建接口类型、delegate创建委托类型
  • 最后的一组表示bool类型的取值、空返回值、空值,以及模拟弱类型语言编程定义变量的关键字

变量、对象与内存

  • 什么是变量
    • 表面上来看,变量的用途是存储数据
    • 实际上,变量表示了存储位置,并且每个变量都有一个类型,以决定什么样的值能够存入变量
    • 变量一共有7种
      • 静态变量,实例变量(成员变量,字段),数组元素,值参数,引用参数,输出形参,局部变量
    • 狭义的变量指局部变量,因为其它种类的变量都有自己的约定名称
      • 简单地讲,局部变量就是方法体(函数体)里声明的变量
    • 变量的声明
      • 有效的修饰符组合(opt)+类型+变量名+初始化器(opt,比如 = 号)
    • 变量 = 以其变量名对应的内存地址为起点的,以其变量类型所要求的存储空间为长度的一块内存区域
    • 值类型的变量
      • 以 byte/sbtye/short/ushort 为例
      • 值类型没有实例,所谓的“实例”与变量合而为一
    • 引用类型的变量与实例
      • 引用类型变量与实例的关系:引用类型变量里存储的数据是对象的内存地址
    • 变量的默认值
    • 常量(值不可改变的变量)
    • 装箱与拆箱(Boxing&Unboxing)

七种变量中的部分实例

class Program
{
    static void Main(string[] args)
    {
        //类类型 class
        //Type myType = typeof(Form);
        //Console.WriteLine(myType.FullName);
        //Console.WriteLine(myType.IsClass);

        //Form // F12跳转类定义

        // 结构体类型struct:int、long  

        // 枚举类型
        // 窗体尺寸只有三种,最小化、最大化、默认值窗口大小
        //Form f = new Form();
        //f.WindowState = FormWindowState.Maximized; // 同样可以通过F12查看该枚举类型定义  enum
        //f.ShowDialog();

        int[] array = new int[100];// 数组
        array[0] = 1; // 第一个元素
        array[99] = 99; // 最后一个元素

        int x; // 局部变量
    }
}

class Student
{
    public static int Amount; // 静态成员:隶属于类的,而不是这个类的实例
    public int Age;  // 字段,相较于属性,属性能够设置一套规则避免不合理的赋值
    public string Name;

    public double Add(double a /*值参数变量*/, ref double b /*引用参数变量*/, out double c /*输出参数变量*/)
    {
        double result = a + b;
        c = result;
        return result;
    }
}

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-YosJZvaM-1679501240550)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20230319172533004.png)]

  • 一个字节由8个byte组成

    • 高位由0补齐(区分大端、小端存储)

    • 位 bit (比特)(Binary Digits):存放一位二进制数,即 0 或 1,最小的存储单位。

    • 字节 byte:8个二进制位(bit)为一个字节(B),最常用的单位。 (我也常说一个字节占8位)

    • 01100100 = 100;按位取反+1 = 10011100 = -100

  • 若需要分配的内存大于一个字节,比如两个字节需要遵循高八位对应第一个字节、低八位分对应第二个字节(区分大端、小端存储)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值