草庐IT

C#基础

tanyuyang的blogs 2023-03-28 原文

1 枚举

    enum E_MonsterType//定义了一个枚举的变量类型
        {
            normal1,//0
            boss = 5,//5
            normal2,//6,前一个自动加1
        }
    //枚举和switch语句天生一对,写switch时能对枚举类型自动补全
    E_MonsterType monsterType = E_MonsterType.boss;/声明枚举变量
        switch (monsterType)
        {
            case E_MonsterType.normal1:
                Console.WriteLine("普通怪物逻辑");
                break;
            case E_MonsterType.boss:
                Console.WriteLine("boss怪物逻辑");
                break;
            default:
                break;
        }

2 数组

2.1 数组

    int[] arr1;//声明数组但没有初始化
    int[] arr2 = new int[5];//初始化,不设置初始值则默认为0
    int[] arr3 = new int[5] {1,2,3,4,5};//初始化并赋值,设置的长度是多少,则初始一定要赋多少值
    int[] arr4 = new int[] {1,2};//数组长度看大括号里面有几个就是几个
    int[] arr5 = {1,2,3,4,5,6,7};
    int[] arr6 = new int[8];
    bool[] arr7 = new bool[] { true, false };

    Console.WriteLine(arr5.Length);//数组变量名.Length获取数组长度
    foreach(int i in arr5)
    {
        Console.WriteLine(i);
    }

    //数组定义之后,是没办法直接添加新的元素,只能通过声明新的数组再复制过去
    for(int i = 0; i < arr5.Length; i++)
    {
        arr6[i] = arr5[i];
    }
    arr6[7] = 8;

2.2 二维数组

    int[,] arr;
    int[,] arr2 = new int[3,3];//初始化一个三行三列全0的二维数组
    int[,] arr3 = 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 } };

    Console.WriteLine(arr5.GetLength(0));//获取二维数组的行数
    Console.WriteLine(arr5.GetLength(1));//获取二维数组的列数

    //foreach也可以按行优先原则输出二维数组元素
    foreach(int i in arr5)
    {
        Console.WriteLine("{0}",i);
    }

2.3 交错数组

    int[][] arr1 = new int[3][] { new int[] { 1, 2, 3 }, new int[] { 4, 5 }, new int[] { 6 } };//每行的列数可以不同
    Console.WriteLine($"数组的行数为:{arr1.GetLength(0)}");
    Console.WriteLine($"数组某一行的列数为:{arr1[0].Length}");
    foreach (int[] a in arr1)//交错数组的元素是数组
    {
        foreach(int b in a)
        {
            Console.WriteLine(b);
        }
    }

3 值类型和引用类型

引用类型:string,数组,类
值类型:其它的,结构体

//无符号整型
    byte b1 = 1;
    ushort us = 1;
    uint ui = 1;
    ulong ul = 1;
//有符号整型
    sbyte sb = 1;
    short s = 1;
    int i = 1;
    long l = 1;
//浮点型
    float f = 1f;
    double d = 1.1;
    decimal de = 1.1m;
//特殊类型
    bool bo = true;
    char c = 'a';
    string str = "strs";
//复杂数据类型
//enum 枚举
//数组 (一维,二维,交错)
//类
//结构体

值类型和引用类型区别

值类型 在相互赋值时 把内容复制给对方 它变我不变

引用类型在相互赋值时 让两者指向同一个值 它变我也变

    //1、使用上的区别
    //值类型
    int a = 10;
    //引用类型
    int[] arr = { 1, 2, 3, 4, 5, 6, };

    int b = a;
    int[] arr2 = arr;
    Console.WriteLine($"a={a},b={b}");
    Console.WriteLine($"arr[0]={arr[0]},arr2[0]={arr2[0]}");

    b = 20;
    arr2[0] = 0;
    Console.WriteLine("修改后:");
    Console.WriteLine($"a={a},b={b}");
    Console.WriteLine($"arr[0]={arr[0]},arr2[0]={arr2[0]}");
    //值类型  在相互赋值时 把内容复制给对方 它变我不变
    //引用类型在相互赋值时 让两者指向同一个值 它变我也变

    //2、原因
    //它们在内存的存储方式是不同的
    //值类型存储在 栈空间,由系统分配,自动回收,小而快
    //引用类型存储在 堆空间,手动申请和释放,大而慢

    //new了新的内存空间,就和arr没关系了
    arr2 = new int[] {99,1,2,3};
    Console.WriteLine($"arr[0]={arr[0]},arr2[0]={arr2[0]}");

string的它变我不变

    //string的它变我不变
    string str1 = "123";
    string str2 = str1;

    //string特殊的地方在于重新赋值时会在堆中重新分配空间,因此它变我不变
    //在频繁对string重新赋值时,会产生内存垃圾
    str2 = "321";

4 函数

4.1 函数语法

    //无参无返回值
    static void SayHello()
    {
        Console.WriteLine("你好!");
    }
    //有参无返回值
    static void SayYourName(string name)
    {
        Console.WriteLine($"你的名字是:{name}");
    }
    //无参有返回值
    static string YourName()
    {
        return "tyy";
    }
    //有参有返回值
    static int Sum(int a, int b) => a + b;//一行代码的可以用=>表示返回值

    //有参有多返回值(用数组)
    static int[] SumAverage(int a, int b)
    {
        int sum = a + b;
        int avg = sum / 2;
        //int[] arr = { sum, avg };
        return new int[] {sum,avg};//一步返回数组需要new
    }
    
    SayHello();
    SayYourName("tyy");
    SayYourName(YourName());//一个函数的返回值作为另一个函数的参数传入
    Console.WriteLine(Sum(1,2));
    int[] arr = SumAverage(7, 9);//也用数组接收函数的数组返回值
    Console.WriteLine($"{ arr[0]}, {arr[1]}");

4.2 ref 和 out

作用:可以解决在函数内部改变外部传入的参数,函数里面改变外面也会改变

    //普通函数
    static void ChangeValue(int value)
    {
        value = 3;
    }
    static void ChangeArray(int[] arr)
    {
        arr = new int[] { 10, 20, 30 };//重新声明数组,外面没有改变
    }
    static void ChangeArrayValue(int[] arr)
    {
        arr[0] = 99;
    }
    
    //参数加ref
    static void ChangeValueRef(ref int value)//定义参数前面加上ref
    {
        value = 3;
    }
    static void ChangeArrayRef(ref int[] arr)
    {
        arr = new int[] { 10, 20, 30 };
    }
    
    //参数加out
    static void ChangeValueOut(out int value)//定义参数前面加上out
    {
        value = 33;
    }
    static void ChangeArrayOut(out int[] arr)
    {
        arr = new int[] { 100, 20, 30 };
    }
    
    int a = 1;
    ChangeValue(a);//a的值没有改变,因为int是值类型
    ChangeValueRef(ref a);//传入参数前也要加上ref或out,修改成功
    ChangeValueOut(out a);
    
    int[] arr1 = {1, 2, 3 };
    ChangeArray(arr1);//函数内重新声明数组,原数组元素值未改变
    ChangeArrayValue(arr1);//a[0]改变了
    ChangeArrayRef(ref arr1);//一起改变了
    ChangeArrayOut(out arr1);

4.3 变长参数 params 和参数默认值

4.3.1 变长参数

params int[]意味着可以传入任意n个参数,n可以为0,传入的参数存在arr数组中

  • params 关键字后面一定是数组
  • 数组可以是任意类型
  • 函数的参数可以是 其他类型的参数和 params 修饰的参数
  • 最多只能有一个 params 关键字,且一定放在最后一组参数
static int Sum(params int[] arr)
{
    int sum = 0;
    for(int i = 0; i < arr.Length; i++)
    {
        sum += arr[i];
    }
    return sum;
}

Sum();
Sum(1, 2, 3, 4, 1, 2, 4, 12, 5, 235, 5, 23, 1, 4, 1);//任意长的参数个数都可以

4.3.2 参数默认值

当函数调用时如果不传入参数,则使用默认值作为参数传入
每个参数都可以有默认值,有默认值的参数必须写在普通参数的后面

static void Speak(string str = "没什么说的")
{
    Console.WriteLine(str);
}
Speak();//使用默认参数
Speak("giao!");//使用传入参数

4.4 函数重载

在同一语句块中,函数的名字相同,但参数的数量、类型或顺序不同,与返回值无关

    static int Sum(int a, int b)
        {
            return a + b;
        }
        
    static int Sum(int a, int b, int c)//参数数量不同
    {
        return a + b + c;
    }

    static float Sum(int a, float b)//参数类型不同
    {
        return a + b;
    }

    static float Sum(float a, int b)//参数顺序不同
    {
        return a + b;
    }

    static int Sum(ref int a, int b)//ref和out也算重载,但一个重载的话另一个就不能重载了,两个中只取一
    {
        return a + b;
    }
    static int Sum(out int a, int b)//ref和out也算重载,但一个重载的话另一个就不能重载了
    {
        a = 1;
        b = 2;
        return a + b;
    }

    static float Sum(int a, int b, params int[] arr)//变长参数重载
    {
        return 1;
    }

5 结构体

struct Student
{
    //public和private修饰结构体中的变量和函数,表示能否被外部使用
    //默认(啥都不写)为private

    //变量
    public int age;
    public bool sex;
    public int number;
    public string name;

    //函数方法 表现这个结构体的行为,不需要加static关键字
    public void Speak()
    {
        //函数中可以直接使用结构体声明的变量
        Console.WriteLine($"我的名字是{name},今年{age}岁");
    }

    //构造函数 用于在外部方便结构体的初始化
    //没有返回值,和结构体名字相同,必须有参数,声明构造函数必须对其中所有变量初始化
    public Student(int age, bool sex, int number, string name)
    {
        //this关键字,相同变量名字时来区分自己和参数
        this.age = age;//必须初始化
        this.sex = sex;
        this.number = number;
        this.name = name;
    }
}

    Student s1;
    s1.age = 10;//public才能在外部使用变量和函数
    s1.sex = false;
    s1.number = 1;
    s1.name = "tyy";
    s1.Speak();

有关C#基础的更多相关文章

  1. c# - 如何在 ruby​​ 中调用 C# dll? - 2

    如何在ruby​​中调用C#dll? 最佳答案 我能想到几种可能性:为您的DLL编写(或找人编写)一个COM包装器,如果它还没有,则使用Ruby的WIN32OLE库来调用它;看看RubyCLR,其中一位作者是JohnLam,他继续在Microsoft从事IronRuby方面的工作。(估计不会再维护了,可能不支持.Net2.0以上的版本);正如其他地方已经提到的,看看使用IronRuby,如果这是您的技术选择。有一个主题是here.请注意,最后一篇文章实际上来自JohnLam(看起来像是2009年3月),他似乎很自在地断言RubyCL

  2. C# 到 Ruby sha1 base64 编码 - 2

    我正在尝试在Ruby中复制Convert.ToBase64String()行为。这是我的C#代码:varsha1=newSHA1CryptoServiceProvider();varpasswordBytes=Encoding.UTF8.GetBytes("password");varpasswordHash=sha1.ComputeHash(passwordBytes);returnConvert.ToBase64String(passwordHash);//returns"W6ph5Mm5Pz8GgiULbPgzG37mj9g="当我在Ruby中尝试同样的事情时,我得到了相同sha

  3. 基于C#实现简易绘图工具【100010177】 - 2

    C#实现简易绘图工具一.引言实验目的:通过制作窗体应用程序(C#画图软件),熟悉基本的窗体设计过程以及控件设计,事件处理等,熟悉使用C#的winform窗体进行绘图的基本步骤,对于面向对象编程有更加深刻的体会.Tutorial任务设计一个具有基本功能的画图软件**·包括简单的新建文件,保存,重新绘图等功能**·实现一些基本图形的绘制,包括铅笔和基本形状等,学习橡皮工具的创建**·设计一个合理舒适的UI界面**注明:你可能需要先了解一些关于winform窗体应用程序绘图的基本知识,以及关于GDI+类和结构的知识二.实验环境Windows系统下的visualstudio2017C#窗体应用程序三.

  4. postman接口测试工具-基础使用教程 - 2

    1.postman介绍Postman一款非常流行的API调试工具。其实,开发人员用的更多。因为测试人员做接口测试会有更多选择,例如Jmeter、soapUI等。不过,对于开发过程中去调试接口,Postman确实足够的简单方便,而且功能强大。2.下载安装官网地址:https://www.postman.com/下载完成后双击安装吧,安装过程极其简单,无需任何操作3.使用教程这里以百度为例,工具使用简单,填写URL地址即可发送请求,在下方查看响应结果和响应状态码常用方法都有支持请求方法:getpostputdeleteGet、Post、Put与Delete的作用get:请求方法一般是用于数据查询,

  5. 软件测试基础 - 2

    Ⅰ软件测试基础一、软件测试基础理论1、软件测试的必要性所有的产品或者服务上线都需要测试2、测试的发展过程3、什么是软件测试找bug,发现缺陷4、测试的定义使用人工或自动的手段来运行或者测试某个系统的过程。目的在于检测它是否满足规定的需求。弄清预期结果和实际结果的差别。5、测试的目的以最小的人力、物力和时间找出软件中潜在的错误和缺陷6、测试的原则28原则:20%的主要功能要重点测(eg:支付宝的支付功能,其他功能都是次要的)80%的错误存在于20%的代码中7、测试标准8、测试的基本要求功能测试性能测试安全性测试兼容性测试易用性测试外观界面测试可靠性测试二、质量模型衡量一个优秀软件的维度①功能性功

  6. ES基础入门 - 2

    ES一、简介1、ElasticStackES技术栈:ElasticSearch:存数据+搜索;QL;Kibana:Web可视化平台,分析。LogStash:日志收集,Log4j:产生日志;log.info(xxx)。。。。使用场景:metrics:指标监控…2、基本概念Index(索引)动词:保存(插入)名词:类似MySQL数据库,给数据Type(类型)已废弃,以前类似MySQL的表现在用索引对数据分类Document(文档)真正要保存的一个JSON数据{name:"tcx"}二、入门实战{"name":"DESKTOP-1TSVGKG","cluster_name":"elasticsear

  7. c# - C# 中的 Flatten Ruby 方法 - 2

    我如何做Ruby方法"Flatten"RubyMethod在C#中。此方法将锯齿状数组展平为一维数组。例如:s=[1,2,3]#=>[1,2,3]t=[4,5,6,[7,8]]#=>[4,5,6,[7,8]]a=[s,t,9,10]#=>[[1,2,3],[4,5,6,[7,8]],9,10]a.flatten#=>[1,2,3,4,5,6,7,8,9,10 最佳答案 递归解决方案:IEnumerableFlatten(IEnumerablearray){foreach(variteminarray){if(itemisIEnume

  8. ruby - 可以像在 C# 中使用#region 一样在 Ruby 中使用 begin/end 吗? - 2

    我最近从C#转向了Ruby,我发现自己无法制作可折叠的标记代码区域。我只是想到做这种事情应该没问题:classExamplebegin#agroupofmethodsdefmethod1..enddefmethod2..endenddefmethod3..endend...但是这样做真的可以吗?method1和method2最终与method3是同一种东西吗?还是有一些我还没有见过的用于执行此操作的Ruby惯用语? 最佳答案 正如其他人所说,这不会改变方法定义。但是,如果要标记方法组,为什么不使用Ruby语义来标记它们呢?您可以使用

  9. c# - Ruby 等效于 C# Linq 聚合方法 - 2

    什么是Linq聚合方法的ruby​​等价物。它的工作原理是这样的varfactorial=new[]{1,2,3,4,5}.Aggregate((acc,i)=>acc*i);每次将数组序列中的值传递给lambda时,变量acc都会累积。 最佳答案 这在数学以及几乎所有编程语言中通常称为折叠。它是更普遍的变形概念的一个实例。Ruby从Smalltalk中继承了这个特性的名称,它被称为inject:into:(像aCollectioninject:aStartValueinto:aBlock一样使用。)所以,在Ruby中,它称为inj

  10. 【网络】-- 网络基础 - 2

    (本文是网络的宏观的概念铺垫)目录计算机网络背景网络发展认识"协议"网络协议初识协议分层OSI七层模型TCP/IP五层(或四层)模型报头以太网碰撞路由器IP地址和MAC地址IP地址与MAC地址总结IP地址MAC地址计算机网络背景网络发展        是最开始先有的计算机,计算机后来因为多项技术的水平升高,逐渐的计算机变的小型化、高效化。后来因为计算机其本身的计算能力比较的快速:独立模式:计算机之间相互独立。    如:有三个人,每个人做的不同的事物,但是是需要协作的完成。    而这三个人所做的事是需要进行协作的,然而刚开始因为每一台计算机之间都是互相独立的。所以前面的人处理完了就需要将数据

随机推荐