• c#中的数据类型与转换


    数据类型转换
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    
    namespace CSharp
    {
        class Demo2
        {
            static void Main(string[] args)
            {
                //类型转换 推荐使用c#给我们的万能转换器Convert.数据类型(需要被转换的值);
                int num = 102;//定义变量还可以这样写 int a,b=1; 数据类型一样可以这样定义 a没有赋值,b赋值了1
                string strnum = num + ""; //等价于 num.ToString(); 需要转换的值.To数据类型(),+号起到连接字符串的作用,当两边都是数字起到相加的作用。
                num = int.Parse(strnum); // 数据类型.Parse(需要转换的值)
                //上面这种灵活性不够,所以尽量使用万能转换器Convert,他是一个转换工厂
                num = Convert.ToInt32(strnum); //数据类型的基类  Convert.ToString(111); 就强制转换为字符串了
                //还有一种强制类型转换:将大类型转换成小类型,这种任意丢失数据 ,了解就好不建议使用  建议使用万能转换器Convert
                double x = 12.36; //可以存整数也可以存小数。小数点后面是15到16位。
                int y = (int)x;//不建议使用,说一下这种是强制类型转换也叫显示类型转换。大转小用
                double nu11 = num;//这种就是自动转换也叫隐示转换,小转大用
    
                decimal m = 1.55m;//存金钱的类型。小数点后面可以跟到28到29位。小数后面必须跟m。不然就会认为是double类型了。
    
                char sex = '';//单字符,不能为空,string可以为空,字符串多了只能用string,只是char运行比string快。注意char是单引号,string是双引号。
                string str = sex.ToString();
                char[] chs = "abcdefg".ToCharArray();//将字符串转换为char数组,通过下标索引来换取每个字母。
                chs[0] = 'd';//相当于把a变成d
                string s = new string(chs); //把char数组转换为字符串。当然普通字符串也可以看做char类型的只读数组。
                Console.WriteLine(s[0]);//既然可以将string看做char类型的只读数组,那么就可以通过下标索引字符串的某个元素。
                Console.WriteLine(s);
    
    
                //了解TryParse方法的使用
                bool tr = int.TryParse("1111布尔值", out num);//布尔类型返回值是true和false常用于if判断里面,TryParse方法是尝试将字符串转换成整形。
                Console.WriteLine("布尔值:{0},转换的整数值为:{1}", tr, num);//如果转换成功就赋值否则就是0
    
                int a = 5;
                int b = a++ + ++a * 2 + --a + a++;//5+7*2+6+6=31 在计算机中++或--是一元运算符,而+-*/%是二元预算法,计算机会先执行一元在算二元预算法。
                Console.WriteLine("b的结果为:" + b + ",而a的结果为:" + a);//b=31,a=7
                Console.WriteLine(a += b);//a+=b等同于 a=a+b
    
                //常量const的定义:在整个程序中一直保持不变的量,
                const double R = 3.14;//如:圆周率=3.14 一直保持不变, 而已整个程序中常量不能被重新赋值。
                //R = 0;//重新给常量赋值就报错,程序不允许给常量赋值,常量常用于一些固定的量。
    
                //变量的区别
                int r = 11;
                r = 22;//变量是可以进行赋值的,常量不可以赋值
    
                //匿名变量可以是任意类型(具有动态类型的特征,不需要明确指定类型,减少代码量,提高效率) 但定义变量时必须赋值明确变量数据类型。
                var strvar = 1;//var 定义匿名函数,相当于 int a=1;  ,匿名函数可以是任意类型,使用时也会自动识别
                var strvar1 = "a";
                var strvar2 = 1.1;
                var strvar3 = true;
                var strvar4 = new List<string>() { "1", "2", "3" };
                //读取数据类型
                Console.WriteLine(strvar.GetType().Name);
                Console.WriteLine(strvar1.GetType().Name);
                Console.WriteLine(strvar2.GetType().Name);
                Console.WriteLine(strvar3.GetType().Name);
                Console.WriteLine(strvar4.GetType().Name);
                Console.WriteLine("------------------");
    
                Console.ReadKey();
                Console.ReadLine();//利用接收输入来暂停程序,避免程序一闪而过 
    
            }
        }
    }
    /*数据类型(两种):

    * 值类型:基本数据类型:int double float..... 结构 枚举 等等都是值类型
    * 引用类型(3种):字符串 数组 类 ;另外一个object是什么类型都能装,他是所有类型的父类。所以object类型也属于引用类型。
    */

    人为把内存分成五个区域在c#用到的就3个:栈中存值类型的,堆中存引用类型的,静态存储区域中存的是静态成员。

      

    字符串值不可变性(堆的不可变性):当一个字符串被重新赋值后原来值并没有销毁,而是重新开辟空间存储新值。

    当程序结束后,gc会扫描整个内存,如果发现空间值没有被指向,就会立即把他销毁。

     

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    
    namespace CSharp
    {
        class shujuleixing //数据类型
        {
            static void Main()
            {
                //装箱和拆箱
                int cc = 12;
                object o = cc;//装箱:值类型转为引用类型叫装箱。
                int xx = (int)o;//拆箱:引用类型转为值类型叫拆箱。
                Console.WriteLine("拆箱后得到值:{0}", xx);
    
                //值类型:存储在栈中,变量中存储的是实际值,可以快速访问  如果定义int a;不赋值默认 a = 0;  值类型没有null空值
                int a = 10;//变量的作用域仅限于当前大括号以内,就是只在当前main方法中有效
                JiSuan.ChangeNum(a);//值传递,传递的只是一个复本,传过去的值num也只在ChangeNum方法的大括号中有效
                Console.WriteLine("a = {0}", a);//因此这里的a依然是10没有任何变化
    
                //引用类型:存储在堆中,变量中存储的是地址,通过地址查找,访问慢。 string str; 不赋值默认  str = null  空值
                int[] arr = { 1, 2, 3, 4, 5, 6 };//arr存储的不是某一个元素,而是是数组的首地址
                //引用类型是地址传递,传递的是内存地址,操作的是同一块内存空间
                JiSuan.ChangeNum(arr);//传过去=告诉他存储的首地址是多少,找到这个地址进行操作,实际上就是指向同一个内存空间中进行操作
                Console.Write("数组元素会被乘以10,如下:");
                foreach (int num in arr)
                {
                    Console.Write(num + ",");
                }
    
                //ref关键字:将值类型按引用类型去传递,传递的就是一个地址了
                JiSuan.ChangeNum(ref a);//方法也需要有ref关键字
                Console.WriteLine("
    关键字ref下的a = {0}", a);//此时a = 11  
    
                Person mj; //= new Person();//结构体可new可不new,类必须new。枚举本质就是一个变量类型
                mj.yue = Month.二月;
                //把枚举转换为整型,这就是枚举和整型值的关系,枚举成员不能有第一个字符不能是整型值的原因,把其他类型变为整型就可以和枚举类型转换
                Console.WriteLine("枚举下的值:{0} = {1}", mj.yue, (int)Month.二月, (Month)11);//整型转枚举:(枚举名)整型值 11得到六月  
                //将字符串转换成枚举类型,所有数据类型转换成字符串都可以调用ToString()
                Month month = (Month)Enum.Parse(typeof(Month), "三月");//如果没有找到对应的值就报错
                Console.WriteLine(month);
    
                //结构和枚举一样本质就是一个变量类型
                Console.ReadLine();
    
            }
    
            
        }
    
        /// <summary>
        /// 在同一个类中,方法名相同参数列表不同叫方法重载。 静态类下面的所有属性都是静态的;
        /// </summary>
        static class JiSuan
        {
            public static void ChangeNum(int num)
            {
                num++;
            }
            public static void ChangeNum(int[] arr)
            {
                for (int i = 0; i < arr.Length; i++)
                {
                    arr[i] = arr[i] * 10;
                }
            }
            public static void ChangeNum(ref int num)
            {
                num++;
            }
        }
        /// <summary>
        /// 枚举:关键字enum基本数据类型是整型,用来表示一些常数,每个枚举的成员默认带有一个整型值,默认0开始,其他成员是前一个成员值加1。
        /// 作用: 1来代替男,2来代替女 的用法。
        /// </summary>
        public enum Month//注意:枚举基本数据类型是整型,所以不允许整型值开头,如:1月这样的程序就报错。
        {
            一月 = 1,//这里指的了从1开始 往后加1,如果不指定默认0开始
            二月,//二月就表示 2
            三月,//三月就表示 3 像作用每个成员往后加1
            四月,
            五月 = 10,//如果这里设置了10
            六月,//那么六月值值 就成了11
            七月,
            八月,
            九月,
            十月,
            十一月,
            十二月
        }
    
        /// <summary>
        /// 结构体:struct关键字,和类差不多,语法:访问修饰符 struct 结构名 {  }
        /// 结构和类的区别:1.结构是值类型,类是引用类型;2.结构字段不能有初始值,类可以有。3.结构调用可new可不new,类必须new。4.结构不能定义无参构造,类可以。
        /// </summary>
        public struct Person
        {
            //在结构中定义有参构造方法,有参构造依然存在,这是结构的特点,所以结构不能定义无参数构造,而类中有了有参构造,默认的无参构造就会消失。
            public Person(Month month) 
            {
                this.yue = month;
            }
            /// <summary>
            /// 枚举类型的属性 public公开的作用加了才能在外部访问,没有的就只能在结构体里面访问
            /// </summary>
            public Month yue; //这里的yue不叫变量叫字段,结构中字段不能赋值,类可以赋值可以不赋值。
    
            //public string _name;//姓名 命名规则 _变量名, 意思是给外面声明一个 Person 类型的一个变量 赋值如 Person._name = 值;
            //public int _age;//年龄
        }
    
    }
  • 相关阅读:
    [LeetCode] 104. Maximum Depth of Binary Tree 二叉树的最大深度
    [LeetCode] Binary Tree Level Order Traversal II 二叉树层序遍历之二
    [LeetCode] 102. Binary Tree Level Order Traversal 二叉树层序遍历
    Color Processing 色彩处理
    Digital Imaging Processing 数字图像处理
    Point Grey articles link
    Some useful links
    [LeetCode] Balanced Binary Tree 平衡二叉树
    [LeetCode] 111. Minimum Depth of Binary Tree 二叉树的最小深度
    [LeetCode] 113. Path Sum II 二叉树路径之和之二
  • 原文地址:https://www.cnblogs.com/longxinyv/p/14396174.html
Copyright © 2020-2023  润新知