C#基础篇

news2024/11/14 14:51:33

枚举enum

枚举的使用

using System.Net.Http.Headers;
using System.Runtime.InteropServices;
using System.Security.Cryptography;

namespace game_code
{
    enum E_MonsterType
    {
        Normal,// 普通怪
        Boos// Boos怪
    }
    internal class Program
    {
        static void Main(string[] args)
        {
            // 枚举更多是用来标识某种状态,多和switch配合使用
            E_MonsterType Player = E_MonsterType.Normal;
            switch (Player) { 
                case E_MonsterType.Normal:
                    Console.WriteLine("执行普通怪的逻辑");
                    break; 
                case E_MonsterType.Boos:
                    Console.WriteLine("执行Boos怪的逻辑");
                    break;
                default:
                    break;
            } 
        }
    }
}

  •  枚举一般在namespace语句块,class语句块,struct语句块中声明,
  • 注意: 枚举不能在函数语句块中声明

枚举的类型转换 

using System.Net.Http.Headers;
using System.Runtime.InteropServices;
using System.Security.Cryptography;

namespace game_code
{
    enum E_MonsterType
    {
        Normal,// 普通怪
        Boos// Boos怪
    }
    internal class Program
    {
        static void Main(string[] args)
        {
            E_MonsterType PlayerType = E_MonsterType.Boos;
            // 枚举 -> int
            int a = (int)PlayerType;
            
            // 枚举 - > string
            string s = PlayerType.ToString();
            
            // int -> 枚举
            PlayerType = 0;// 普通怪
            // PlayerType = 1;// error
            
            // string -> 枚举
            PlayerType= (E_MonsterType)Enum.Parse(typeof(E_MonsterType), "Other");
        }
    }
}

C#数组 && C++数组的区别 

  •  C#数组是 int [] arr = {1,2,3,4,5};
  • C++数组是 int arr[] = {1,2,3,4,5};

C#数组的使用 && 注意事项

using System.Net.Http.Headers;
using System.Runtime.InteropServices;
using System.Security.Cryptography;

namespace game_code
{
    internal class Program
    {
        static void Main(string[] args)
        {
            int[] arr = {1,2,3,4,5};
            Console.WriteLine("arr的长度是{0}", arr.Length);
        }
    }
}

 

  • 一维数组.Length 得到数组长度 
  • 数组本身无法新增,或删除元素,当然如果必须的话,就必须要通过另一个数组实现

二维数组

using System.Net.Http.Headers;
using System.Runtime.InteropServices;
using System.Security.Cryptography;

namespace game_code
{
    internal class Program
    {
        static void Main(string[] args)
        {
            #region 二维数组
            int[,] arr;
            int[,] arr1 = new int[3, 3];
            int[,] arr2 = new int[3, 3] { 
                {1,2,3},
                {4,5,6,},
                {7,8,9}
             };
            int[,] arr4 = new int[, ] {
                {1,2,3},
                {4,5,6,},
                {7,8,9}
             };
            int[,] arr5 ={
                {1,2,3},
                {4,5,6,},
                {7,8,9}
            };
            #endregion
            // 二维数组的遍历
            for(int i = 0;i < arr5.GetLength(0);i++)
            {
                for(int j = 0;j < arr5.GetLength(1); j++)
                {
                    Console.Write(arr5[i, j] + " ");
                }
                Console.WriteLine();
            }
        }
    }
}

  •  二维数组.GetLength(0)   表示二维数组的行
  • 二维数组.GetLength(1)   表示二维数组的列
  • 二维数组[i,i]    表示二维数组的i行j列的元素

 交错数组(了解)

  • 基本概念: 可以存储同一类型的m行不确定列的数据
using System.Net.Http.Headers;
using System.Runtime.InteropServices;
using System.Security.Cryptography;

namespace game_code
{
    internal class Program
    {
        static void Main(string[] args)
        {
            int[][] arr1;
            int[][] arr2 = new int[3][];
            int[][] arr3 = new int[3][]
            {
                new int[] { 1, 2, 3 },
                new int[] { 1, 2 },
                new int[] { 1, },
            };
            int[][] arr4 = new int[][]
            {
                new int[] { 1, 2, 3 },
                new int[] { 1, 2 },
                new int[] { 1, },
            };
            int[][] arr5 =
            {
                new int[] { 1, 2, 3 },
                new int[] { 1, 2 },
                new int[] { 1, },
            };
            // 遍历交错数组
            for(int i = 0;i < arr5.GetLength(0); i++)
            {
                for(int j = 0;j < arr5[i].Length; j++)
                {
                    Console.Write(arr5[i][j] + " ");
                }
                Console.WriteLine();
            }
        }
    }
}

 

  •  交错数组.GetLength(0) 得到行数
  • 交错数组[i].Length 得到i行的列数
  •  交错数组[i][j] 表示交错数组的i行j列的元素

 引用类型 && 值类型

namespace game_code
{
    internal class Program
    {
        // 注意这里要加static
        static void Show(int[] arr)
        {
            for (int i = 0; i < arr.Length; i++)
            {
                Console.Write(arr[i] + " ");
            }
            Console.WriteLine();
        }
        static void Main(string[] args)
        {
            int[] arr = { 1, 2, 3 };
            int[] arr1 = arr;
            for (int i = 0; i < arr1.Length; i++)
            {
                arr1[i] += 1;
            }
            Show(arr);
            Show(arr1);
            Console.WriteLine();
            int[] arr2 = arr1;
            arr2 = new int[] {1, 2, 3 };
            Show(arr1);
            Show(arr2);
        }
    }
}

 

  • 引用类型(本身就是引用): string 数组 类
  • 值类型(值传递): 其他类型,结构体 

 特殊的string引用类型

namespace game_code
{
    internal class Program
    {
        static void Main(string[] args)
        {
            string s = "123";
            string s1 = s;
            s1 = "234";
            Console.WriteLine(s);
            Console.WriteLine(s1);
        }
    }
}

  • 虽然string是引用类型,但是它只表现出了值类型的特征

返回多个值的函数

namespace game_code
{
    internal class Program
    {
        static int [] Calc(int a,int b)
        {
            int sum = a + b;
            int avg = sum / 2;
            return new int[] {avg, sum};
        }
        static void Main(string[] args)
        {
            int a = Convert.ToInt32(Console.ReadLine());
            int b = Convert.ToInt32(Console.ReadLine());
            int []ret = Calc(a, b);
            Console.WriteLine(ret[0] + " " + ret[1]);
        }
    }
}

  •  通过数组返回就可以实现返回多个值

引用ref && 引用out

namespace game_code
{
    internal class Program
    {
        static void ChangeValueRef(ref int value)
        {
            value = 10;// 可改可不改
        }
        static void ChangeValueRef(int value)
        {
            value = 10;// 可改可不改
        }
        static void ChangeArrayRef(ref int[] arr)
        {
            arr = new int[] {10,20,30 };// 可改可不改
        }
        static void ChangeValueOut(out int value)
        {
            value = 1000;// 必须改
        }
        static void ChangeArrayOut(out int[] arr)
        {
            arr = new int[] { 1000, 2000, 3000 };// 必须改
        }
        static void Show(int tmp)
        {
            Console.WriteLine(tmp);
        }
        static void Show(int[] tmp)
        {
           for(int i = 0; i < tmp.Length; i++) {
                Console.Write(tmp[i] + " ");
           }
            Console.WriteLine();
        }
        static void Main(string[] args)
        {
            // 用ref传的参数必须初始化
            int num = 2;
            int[] arr = new int[] {2,2,2 };
            Show(num);
            Show(arr);

            ChangeValueRef(ref num);
            ChangeArrayRef(ref arr);
            Show(num);
            Show(arr);

            // 用out传的参数不用初始化
            int num1;
            int[] arr1;
            ChangeValueOut(out num1);
            ChangeArrayOut(out arr1);
            Show(num1);
            Show(arr1);
        }
    }
}

  •  ret传入的变量必须初始化 但是在内部 可改可不改

  • out传入的变量不用初始化 但是在内部 必须修改该值(必须赋值)

namespace game_code
{
    internal class Program
    {
        static void ChangeValueRef(ref int value)
        {
            value = 10;
        }
        static void ChangeValueRef(int value)
        {
            value = 10;
        }
        static void Main(string[] args)
        {
            // 用ref传的参数必须初始化
            int num = 2;
            Console.WriteLine(num);

            ChangeValueRef(num);
            Console.WriteLine("没加ret: {0}", num);

            ChangeValueRef(ref num);
            Console.WriteLine("加了ret: {0}", num);
        }
    }
}

 

 ref和out的作用: 解决值类型和引用类型 在函数内部 改值 或者 重新声明 能够影响外部传入的变量 让其也被修改

params变长参数

 作用: 可以传入n个同类型参数,n可以是0

using Microsoft.VisualBasic;

namespace game_code
{
    internal class Program
    {
        static int Sum(params int[] nums)
        {
            int sum = 0;
            for(int i = 0;i < nums.Length;i++) { 
                sum += nums[i];
            }
            return sum;
        }
        static void Main(string[] args)
        {
            int[] arr = { 1, 2, 3, 4, 5, };
            int ret = Sum(arr);
            Console.WriteLine(ret);
        }
    }
}

 

  • params后面必须是数组,意味着只能是同一类型的可变参数
  • 变长参数只能有一个
  • 必须在所有参数的最后写变长参数

 struct结构体 && 访问限定符

using Microsoft.VisualBasic;

namespace game_code
{
    internal class Program
    {
        // 结构体默认是private
        struct Person
        {
            // struct中的函数不用加static
            public Person(int age = 0,string name = "",int id = 0)
            {
                _age = age;
                _name = name;
                _id = id;
            }
            public int _age;
            public string _name;
            private int _id;// 学号
        }
        static void Main(string[] args)
        {
           Person A = new Person(18,"lyc最帅",1241241412);
           Console.WriteLine(A._name);
           // Console.WriteLine(A._id);// error
        }
    }
}

  • public能在结构体内外访问,private只能在结构体外访问
  1. 在结构体中申明的变量 不能初始化 只能在外部或者在函数中赋值(构造函数)
  2. 在结构体中申明的函数 不用加static

冒泡排序

using Microsoft.VisualBasic;

namespace game_code
{
    internal class Program
    {
        static void Swap(ref int a,ref int b)
        {
            int tmp = a;
            a = b;
            b = tmp;
        } 
        static void Show(int[] arr)
        {
            for(int i = 0;i < arr.Length; i++)
            {
                Console.Write(arr[i] + " ");
            }
            Console.WriteLine();
        }
        static void Main(string[] args)
        {
            #region 冒泡排序
            int[] arr = { 9, 7, 1, 5, 4, 2, 6, 3, 8 };
            // int[] arr = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
            for (int i = 0;i < arr.Length;i++) { 
                bool isSwap = false;// 优化一
                for (int j = 1;j < arr.Length -i;j++){
                    // 前一个大于后一个就交换
                    if (arr[j-1] > arr[j]){
                        isSwap = true;
                        Swap(ref arr[j-1], ref arr[j]);
                    }
                }
                if (!isSwap){
                    break;
                }
            }
            Show(arr);
            #endregion
        }
    }
}

  •  如果一轮比较下来都没有发生交换,则说明此时排序已经完成了

选项排序

using Microsoft.VisualBasic;

namespace game_code
{
    internal class Program
    {
        static void Swap(ref int a,ref int b)
        {
            int tmp = a;
            a = b;
            b = tmp;
        } 
        static void Show(int[] arr)
        {
            for(int i = 0;i < arr.Length; i++)
            {
                Console.Write(arr[i] + " ");
            }
            Console.WriteLine();
        }
        static void Main(string[] args)
        {
            #region 选择排序
            int[] arr1 = { 9, 7, 1, 5, 4, 2, 6, 3, 8 };
            for (int i = arr1.Length - 1; i >= 0; i--)
            {
                int tmp_pos = 0;// 中间商
                for (int j = 1; j < i + 1; j++)
                {
                    // 前一个大于后一个就交换
                    if (arr1[tmp_pos] < arr1[j])
                    {
                        tmp_pos = j;
                    }
                }
                Swap(ref arr1[tmp_pos], ref arr1[i]);
            }
            Show(arr1);
            #endregion
        }
    }
}

 

  1. 新建中间商
  2. 依次比较
  3. 找出极值(最大或最小)
  4. 放入目标位置

优化版本 

using Microsoft.VisualBasic;

namespace game_code
{
    internal class Program
    {
        static void Swap(ref int a,ref int b)
        {
            int tmp = a;
            a = b;
            b = tmp;
        } 
        static void Show(int[] arr)
        {
            for(int i = 0;i < arr.Length; i++)
            {
                Console.Write(arr[i] + " ");
            }
            Console.WriteLine();
        }
        static void Main(string[] args)
        {
            #region 选择排序(双中间商实现)
            int[] arr1 = { 1,9, 7, 1, 5, 4, 2, 6, 3, 8 ,0};
            int begin = 0;// 最左边
            int end = arr1.Length - 1;// 最右边
            while(begin < end)
            {
                int maxi = begin;// 找最大的值的下标
                int mini = begin;// 找最小的值的下标
                for(int i = begin; i <= end; i++)
                {
                    if (arr1[maxi] < arr1[i])
                    {
                        maxi = i;
                    }
                    if (arr1[mini] > arr1[i])
                    {
                        mini = i;
                    }
                }
                if(maxi == begin)
                {
                    Swap(ref arr1[begin++], ref arr1[mini]);
                    maxi = mini;
                }
                Swap(ref arr1[end--],ref arr1[maxi]);
            }
            Show(arr1);
            #endregion
        }
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/393242.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Linux信号量详解

一、什么是信号量信号量的本质是一种数据操作锁、用来负责数据操作过程中的互斥、同步等功能。信号量就和互斥锁类似&#xff0c;本质上就是一个计数器&#xff08;全局变量&#xff09;。不同之处在于&#xff0c;互斥锁的值只有 2 个&#xff08;加锁 "lock" 和解锁…

Mysql Server原理简介

Mysql客户端包括JDBC、 Navicat、sqlyog&#xff0c;只是为了和mysql server建立连接&#xff0c;向mysql server提交sql语句。mysql server组件第一部分叫连接器主要承担的功能叫管理连接和验证权限&#xff0c;每次在进行数据库访问的时候&#xff0c;必然要输入用户名和密码…

421 Maximum login limit has been reached. on hdfs-over-ftp

使用 hdfs-over-ftp 时登录报错421 Maximum login limit has been reached. 本地测试连接第10个用户的时候会报这个异常 就是默认限制了用户登录数量。 DefaultConnectionConfig.java里private int maxLogins 10; 在HdfsOverFtpServer.java里修改了startServer()这个metho…

MSTP基础

MSTP基础引入背景技术概览PVSTP&#xff08;过渡&#xff09;MSTP单生成树的缺陷1&#xff1a;部分VLAN不通单生成树的缺陷2&#xff1a;无法实现流量的负载分担多生成树解决单生成树实例引入背景 RSTP在STP基础上进行了改进&#xff0c;实现了网络拓扑快速收敛。但由于局域网…

【redis学习篇】Redis三种持久化方式详解

官方文档 一、Redis持久性 Redis如何将数据写入磁盘 持久性是指将数据写入持久存储&#xff0c;如固态磁盘&#xff08;SSD&#xff09;。Redis提供了一系列持久性选项。其中包括&#xff1a; RDB&#xff08;快照&#xff09;&#xff1a;RDB持久性以指定的时间间隔执行数据…

程序员的上帝视角(4)——视角

对于开发人员来说&#xff0c;工作都是从评估一个需求开始。我们第一个要解决的问题就是看待需求的视角。视角的不同&#xff0c;得到的设计方案可能是完全不同的。作为一个程序员&#xff0c;不能单单从个人视角来看待问题。而是要尝试从不同角色出发&#xff0c;不停思考。上…

C++——内存管理

一&#xff0c;为什么要有内存管理因为在C/C中各个内置类型或者是自定义类型的大小都不一样&#xff0c;而如何让各个类型在内存中合理分布就非常有必要&#xff0c;由此我们就需要有内存管理。我们来看看下面这个程序中的各个变量都是如何分布的int globalVar 1; static int …

100种思维模型之混沌与秩序思维模型-027

人类崇尚秩序与连续性&#xff0c;我们习惯于我们的日常世界&#xff0c;它以线性方式运作&#xff0c;没有不连续或突跳。 为此&#xff0c;我们学会了期望各种过程以连续方式运行&#xff0c;我们的内心为了让我们更有安全感&#xff0c;把很多事物的结果归于秩序&#xff0c…

链表的中间结点与链表的倒数第k个结点(精美图示详解哦)

全文目录引言链表的中间结点题目描述与思路实现链表的倒数第k个结点题目描述与思路实现总结引言 在上一篇文章中&#xff0c;介绍了反转链表 我们利用了链表是逻辑连续的特点&#xff0c;逆置了链表的逻辑连接顺序&#xff0c;从而实现反转链表&#xff1a; 戳我查看反转链表详…

【编程基础之Python】11、Python中的表达式

【编程基础之Python】11、Python中的表达式Python中的表达式表达式与运算符算术表达式赋值表达式比较表达式逻辑表达式位运算表达式总结Python中的表达式 在Python中&#xff0c;表达式是由操作数、运算符和函数调用等组成的语法结构&#xff0c;可以进行各种数学运算、逻辑判…

Maven环境下构建多模块项目

使用maven提供的多模块构建的特征完成maven环境下多模块的项目的管理和构建 这里以四个模块为例来搭建项目&#xff0c;以达到通俗易懂的初衷 模块 maven_parent -- 基模块&#xff0c;也就是常说的parent (pom) 模块 maven_dao -- 数据库访问层&#xff0c;例如jdbc操作(jar) …

华为OD机试题,用 Java 解【查找重复代码】问题

华为Od必看系列 华为OD机试 全流程解析+经验分享,题型分享,防作弊指南)华为od机试,独家整理 已参加机试人员的实战技巧华为od 2023 | 什么是华为od,od 薪资待遇,od机试题清单华为OD机试真题大全,用 Python 解华为机试题 | 机试宝典使用说明 参加华为od机试,一定要注意不…

深度学习技巧应用3-神经网络中的超参数搜索

大家好&#xff0c;我是微学AI&#xff0c;今天给大家带来深度学习技巧应用3-神经网络中的超参数搜索。 在深度学习任务中&#xff0c;一个算法模型的性能往往受到很多超参数的影响。超参数是指在模型训练之前需要我们手动设定的参数&#xff0c;例如&#xff1a;学习率、正则…

计算机科学导论笔记(三)

五、计算机组成 计算机组成部件可以分为三大类&#xff08;子系统&#xff09;&#xff1a;中央处理单元&#xff08;CPU&#xff09;、主存储器和输入/输出子系统。 5.1 中央处理单元&#xff08;CPU&#xff09; 中央处理单元用于数据的运算&#xff0c;分为算术逻辑单元&a…

谁是世界上最好的编程语言?--编程语言70年浅谈

1、编程语言发展史纵览 严谨起见&#xff0c;本文提到的编程语言指的是「第三代高级编程语言」。 首先&#xff0c;我们从时间维度入手聊聊编程语言。一图胜千言&#xff0c;我们从目前主流的编程语言中&#xff0c;挑选出流行的、具有历史影响力的语言。把它们按时间从上往下…

【Java笔记】泛型

本章专题与脉络 泛型概述 生活中的例子 举例1&#xff1a;中药店&#xff0c;每个抽屉外面贴着标签 举例2&#xff1a;超市购物架上很多瓶子&#xff0c;每个瓶子装的是什么&#xff0c;有标签 举例3&#xff1a;家庭厨房中&#xff1a; Java中的泛型&#xff0c;就类似于上…

Spark 平衡 CPU

Spark 平衡 CPUCPU/内存平衡CPU 低效线程挂起调度开销优化 CPUCPU/内存平衡 Spark 将内存分 : Execution Memory : 用于分布式任务执行Storage Memory : 用于 RDD 缓存RDD 缓存展开前消耗 Execution Memory , 最后占用 Storage Memory 线程/执行内存关系&#xff1a; 执行内…

Eclipse快捷键,IDEA中使用Eclipse快捷键

/** Eclipse中的快捷键&#xff1a;* 1.补全代码的声明&#xff1a;alt /形参提示&#xff1a;Ctrl alt /* 2.快速修复: ctrl 1 * 3.批量导包&#xff1a;ctrl shift o* 4.使用单行注释&#xff1a;ctrl /* 5.使用多行注释&#xff1a; ctrl shift / * 6.取消多行注释…

《数据解构》HashMap源码解读

&#x1f451;作者主页&#xff1a;Java冰激凌 &#x1f4d6;专栏链接&#xff1a;数据结构 目录 了解HashMap HashMap的构造 两个参数的构造方法 一个参数的构造方法 不带参数的构造方法 哈希表初始化的长度 HashMap源码中的成员 Pt Get 了解HashMap 首先我们要明…

C语言——文件操作

文章目录0. 思维导图1. 为什么使用文件2. 什么是文件2.1 程序文件2.2 数据文件2.3 文件名3. 文件的打开和关闭3.1 文件指针3.2 文件的打开和关闭4. 文件的顺序读写4.1 字符/字符串写入&#xff08;出&#xff09;4.2 格式化写入&#xff08;出&#xff09;4.3 二进制输入&#…