数往知来C#之面向对象准备〈一〉

1.CLR加载编译源文件

 

 

注1.:当你点击调试或者生成解决方案的时候这就是一个编译过程首先CLR加载源文件也就是你写的代码(此代码在文件中是字符串)然后将项目中的嗲吗编译成IL代码进而生成程序集 证明过程 用反编译工具反编译.exe文件 。更深层次的变化我也不知道。

注2.当项目启动时,CLR(公共语言运行库)会加载项目里的所有类到内存,并找到其中的主函数,作为默认的启动函数调用执行。但是如果项目中包含一个以上的主函数时,clr因为不知道要从哪个启动,所以报错。反之如果项目中没有包含主函数,clr也不知道如何启动,所以也报错。

2.多维数组和交错数组

?声明一个变量的时候,其实是在内存的栈里面开辟空间,默认情况下的值是null;如 int[] arrInt;//此时arrint等于null;int[] arrInt= new int[5];注意等号左侧在栈中间开辟了一个小空间;右边在堆空间里,开辟了连续的5个空间;等号执行的时候,会将堆里开辟的第一个空间的地址赋值给栈里的空间。

**数组的声明与创建如下图:

3.方法 参数 返回值

1.为什么要有方法?           1.重复调用      2.封装具体的实现。

2.概念:

函数就是将一堆代码进行重用的一种机制。函数就是一段代码,这段代码可能有输入的值(参数),可能会返回值。一个函数就像一个专门做这件事的人,我们调用它来做一些事情,它可能需要我们提供一些数据给它,它执行完成后可能会有一些执行结果给我们。要求的数据就叫参数,返回的执行结果就是返回值。

3.string s=Console.ReadLine()就是一个有返回结果的函数;

Console.WriteLine(“hello”)就是一个有执行参数的函数,只有告诉WriteLine被打印的数据它才知道如何打印;

int i=Convert.ToInt32("22")则是一个既有参数又有返回值的函数。

注:有了函数写代码就像拼积木,C#中的各种各样的技术其实就是通过for、if等这些基础的语法将不同的函数按照一定的逻辑组织起来。

4.方法的定义:
[访问修饰符] [static] 返回值类型 方法名(参数列表)
{
        方法体;
}

方法的大括号就是一个作用域块,在该作用域里声明的变量只能在该作用域使用。 命名规则:方法名开头大写,参数名开头小写,参数名、变量名要有意义
方法的调用,对于静态方法,如果在同一个类中,直接写名字调用就行了.      return 为方法返回值。 同时可以立即退出方法。

5.常用的已经学过的方法:

Console.WriteLine();
Console.Write();
Console.ReadLine();
Console.ReadKey();
int.Parse(string);
Convert.ToInt32(string);
对于由static修饰的方法,使用:类名.方法名()调用.
如果在类中调用自己的由static修饰的方法,可以省略类名.

4.退出多重循环

 

static void()
{
    for(int i = 0; i < 10 ;i++)
  {
        for(int j = 0 ;j<10;j++)
       {
              break;//退出当前循环
              continue;    //退出本次循环
              Console.WriteLine(“不执行了”);
       }
   }
}

注1.break 退出当前循环的意思是不管 J 等于3或者4 里面的for循环都不执行了。

注2.continue 推出本次循环的意思是 continue下面的console.writeline本次不执行了 接着执行 J 等于 1的下一次循环。

5.变量的作用域(局部变量)

1.阅读下面的程序,说一下输出结果是多少?

2.

局部变量:在方法中定义的变量,其作用域从定义开始,到其所在的大括号结束为止。问题:在if中的呢?在一个方法中想要访问另一个方法中的变量,怎么办?两种解决方法:参数和返回值       举例:写一个方法,判断一个年份是否是润年.

   方法中的return语句

   导致函数立即返回。

   有void 表示无返回值,当然就不用return。

   在返回值非void的函数中return值

//只要出现了大括号,就会有一个新的作用域块,那么该作用域中创建的对象都不能超出此作用域访问。

6.关于Caonsole.WriteLine()分析 主要解释方法的重载

其实大家看仅仅这一个console.writeline微软就封装很多,有时候我只知道怎么用,为什么它能这么用,微软为了使用方便封装了太多的东西让你看不到。

问题 : 为什么要有方法的重载? 可以只记一个方法名,传入不同的参数,就可以调用对应的方法。

示例:使用方法重载来完成计算器

public class _20120213_02简单计算器
    {
        //方法重载的关键条件,是方法名一致,参数列表不同;
        //使用方法重载,来完成简单的计算器
        static void Main4(string[] arr)
        {
            //要求,接收用户的两个数,当然,可以是整型的,也可以是小数的
            //输出:两数的结果
            //提示用户输入第一个数
            Console.WriteLine("请输入第一个数:");
            //接受第一个数
            string strNumA = Console.ReadLine();
            //提示用户输入第二个数
            Console.WriteLine("请输入第二个数:");
            //接受第二个数
            string strNumB = Console.ReadLine();
            //计算结果
            if (strNumA.IndexOf(‘.‘) > -1 || strNumB.IndexOf(‘.‘) > -1)
            {
                double fNumA = Convert.ToDouble(strNumA);
                double fNumB = Convert.ToDouble(strNumB);
                double iResult = Add(fNumA, fNumB);
                Console.WriteLine("结果:" + iResult);
            }
            else
            {
                int iNumA = Convert.ToInt32(strNumA);
                int iNumB = Convert.ToInt32(strNumB);
                int iResult= Add(iNumA, iNumB);

                Console.WriteLine("结果:"+iResult);
            }
            Console.ReadKey();
        }

        //以下的三个方法,名字一样,但是方法的参数列表 个数 或 类型 不同,所以构成了方法重载

        static int Add(int numA, int numB)
        {
            return numA + numB;
        }

        static double Add(double numA, double numB)
        {
            return numA + numB;
        }

        static double Add(double numA)
        {
            return numA;
        }
    }

注 :out与ref的相同点和不同点。

相同点 : 凡事使用out/ref修饰的参数,传递的都是引用。

不同点: 1.out关键字侧重于输出参数,也就是我调用你这个方法,是为了通过输出的方式获得值。(return返回值也是为了通过方法获得值):通常在方法需要多个值的时候使用。所以out参数必须在方法返回多个值的时候使用

          2..ref侧重于修改:也就是我调用你这个方法,病传入参数的目的是为了在方法中修改传入的这个变量。所以ref参数必须在传入之前就赋值。

代码示例:

public class _20120213_05ATM
    {
        static void Main(string[] str)
        {
            double myMoney = 30000;
            Operating(ref myMoney);
        }

        #region 01.ATM启动
        /// <summary>
        /// 01.ATM启动
        /// </summary>
        /// <param name="count">账户余额</param>
        static void Operating(ref double count)
        {
            do
            {
                Console.WriteLine("请问您是要存还是取呢?亲~~(1-存,2-取)~");
                string optType = Console.ReadLine();
                if (optType != "1" && optType != "2")
                {
                    Console.WriteLine("您输入的操作类型有误,请重新输入~~");
                    continue;
                }
                do
                {
                    Console.WriteLine("请输入要操作的金额(以元为单位):");
                    string strMoney = Console.ReadLine();
                    double dMoney = 0;

                    if (double.TryParse(strMoney, out dMoney))//如果转换成功返回true;并且dMoney里已被赋值。
                    {
                        //传入参数:操作类型,操作金额,账户余额
                        if (Branch(optType, dMoney, ref count))
                        {
                            Console.WriteLine("操作完毕,成功啦~~");
                            Console.WriteLine("显示余额:" + count);
                            break;//如果操作过程么有错误,则跳出 当前循环(此循环用来在数据类型有误时提示用户重新操作)
                        }
                    }
                    else
                    {
                        Console.WriteLine("您输入的数据类型有误~~");
                    }
                } while (true);
                Console.WriteLine("是否要继续操作?(Y/N)");
                string strRes = Console.ReadLine();
                if (strRes.ToUpper() == "N")
                {
                    break;//跳出 整个操作循环,任务即将结束
                }
            } while (true);
            Console.WriteLine("任务结束~~按任意键退出");
            Console.ReadLine();
        }
        #endregion

        #region 02.根据类型判断操作
        /// <summary>
        /// 02.根据类型判断操作
        /// </summary>
        /// <param name="optType"></param>
        static bool Branch(string optType,double money,ref double count)
        {
            switch (optType)
            {
                case "1":
                    SaveMoney(money, ref count);
                    return true;
                case "2":
                    {
                        return GetMoney(money, ref count);
                    }
                default:
                    return false;
            }
        }
        #endregion

        #region 03.存钱取钱
        static void SaveMoney(double money, ref double count)
        {
            count += money;
            Console.WriteLine("存钱成功~~");
        }

        static bool GetMoney(double money, ref double count)
        {
            if (money < count)
            {
                count -= money;
                Console.WriteLine("取钱成功~~");
            }
            else
            {
                Console.WriteLine("Sorry,您的余额好像不足了哦~~~");
            }
            return money < count;
        }
        #endregion
    }

 

7.可变参数Params

示例代码:

public class _20120213_06可变数组参数
    {
        static void Main8(string[] str)
        {
            //一、可变参数params:使用的时候(调用方法的时候):
            //1.还是可以直接传数组进去的
            string[] dogsNames = { "小花", "小妞", "阿黄", "大黄", "小强" };
            //BuyDogs(dogsNames);
            //2.也可以直接传 和 参数数组 同类型的 元素进去
            //BuyDogs("小花", "小妞", "阿黄", "大黄", "小强");

            //二、容易犯的错
            //规定 可变参数 在一个方法的参数列表中:
            //1.方法的参数列表中 可变参数 只能有一个;
            //2.这仅有的一个 可变参数 必须在参数列表的最后;
            BuyDogs("刘德华", "小花", "小妞", "阿黄", "大黄", "小强");
            Console.ReadLine();
        }

        static void BuyDogs(params string[] dogsNameArr)
        {
            for (int i = 0; i < dogsNameArr.Length; i++)
            {
                Console.WriteLine("第" + (i + 1) + "只小狗的名字为:" + dogsNameArr[i]);
            }
        }

        static void BuyDogs(string masterName,params string[] dogsNameArr)
        {
            for (int i = 0; i < dogsNameArr.Length; i++)
            {
                Console.WriteLine(masterName + " 的第" + (i + 1) + "只小狗的名字为:" + dogsNameArr[i]);
            }
        }

        static void BuyDogs(string masterName, string masterName2, params string[] dogsNameArr)
        {
            for (int i = 0; i < dogsNameArr.Length; i++)
            {
                Console.WriteLine(masterName + ",masterName2=" + masterName2 + " 的第" + (i + 1) + "只小狗的名字为:" + dogsNameArr[i]);
            }
        }
    }

注: 当多个方法的参数列表中和后面可变参数的类型一样的时候,用户调用该方法,会优先调用参数多的方法。

 

--此文算是以后研究更深层次的引子吧,比如out和ref深层次的研究。

时间: 2024-08-02 15:11:34

数往知来C#之面向对象准备〈一〉的相关文章

数往知来C#面向对象准备〈二〉

面向对象(OOP→Object-Oriented Programming) 1.什么是面向对象? 一种分析问题的方式. 2.面向对象三大特征:  封装(隐蔽代码实现/复用/修改方便).继承.多态. 3.什么是类?什么是对象?类和对象的区别?如何写一个汽车类? 类是模具,创建对象的模具,抽象的. 类是一种数据类型,用户自定义的数据类型       类组成:字段.属性.方法.构造函数等 对象是具体的,是类的具体实例. 对象具有属性(特征)和方法(行为) 案例:创建学生类,老师类,通过构造函数初始化类

〈二〉ElasticSearch的认识:索引、类型、文档

目录 上节回顾 本节前言 索引index 创建索引 查看索引 查看单个索引 查看所有索引 删除索引 修改索引 修改副本分片数量 关闭索引 索引别名 增加索引别名: 查看索引别名: 删除索引别名: 补充 小节总结: 类型type 补充: 小节总结: 文档document 插入文档 查询指定文档 更新文档 删除文档 查询所有文档 补充: 小节总结 发表日期:2019年9月19日 上节回顾 在学习新的内容之前,先回顾一下上节的内容,上节主要讲述了以下的内容: ElasticSearch是什么?什么是搜

〈三〉ElasticSearch的认识:搜索、过滤、排序

目录 上节回顾 本节前言 文档的搜索 URL参数条件搜索 请求体条件搜索 语法与示例: 补充: 小节总结: 文档的过滤filter 语法与举例: filter与bool constant_score cache 小节总结: 文档的聚合分析 准备数据 语法与举例: 其他语法: 补充: 小节总结: 文档的分页.排序 分页 排序 deep paging 补充: 小节总结: 发表日期:2019年9月20日 上节回顾 1.讲了如何对索引CRUD 2.重新解释了type,只是元数据的效果 3.讲了如何对文档

数往知来C#面向对象〈三〉

C# 基础方法篇 一.复习 1)方法的重载 方法的重载并不是一个方法,实际上方法的重载就是一些不同的 方法,目的是为了方便程序员编码,所以将功能相近的方法命名相同 根据参数,编译器自动的去匹配方法体,而不需要程序员记住 的方法 -->如何判断重载写的对不对 将方法的定义拿出来,去掉修饰符,去掉方法体,去掉返回类型 int InputNum() int InputNum(int max) int InputNum(int min,int max) -->将参数列表中的局部变量名去掉,只留参数类型

C#中List〈string〉和string[]数组之间的相互转换

1,从System.String[]转到List<System.String> System.String[] str={"str","string","abc"}; List<System.String> listS=new List<System.String>(str); 2, 从List<System.String>转到System.String[] List<System.Strin

关于AI的三个故事〈一〉

本期导读:一个机器人拥有了意识,它对老板做了怎样的事情?一位专攻机器人的大牛,她有怎样的历程?一个十一岁的孩子,他玩儿着游戏就毁掉了一个星球? <机器姬>:如果人工智能拥有了意识-- 虽然是人工智能类的电影,但<机器姬>一点儿也不烧脑.电影主要围绕着三个人--从影片的结尾来看,艾娃显然也是人了--展开,向我们展示了对人工智能可能吞噬人类的思考和担忧. 这样的担忧是有理由的.比如现在人工智能深度学习的"黑箱":我们知道机器给出了1+1等于2的结果,但是怎么算的,并

关于AI的三个故事〈三〉

本期导读:一家让老板笑.让员工哭的公司,一部超时代的电影和美貌与实力并存的女神. Status Today:连员工都搞不定?起开,让我来! 在今天,对于一家公司来说,如何保证公司的商业信息不被泄露是一个挺伤脑筋的事情:前员工离职.恶意电子邮件.内鬼员工交易--似乎公司一直都处在风险之中. 而有家英国公司就瞄准了这个领域,专门做对人的意向及行为分析.通过挖掘和分析员工的数据,从而来保证个体和公司的安全.它就是Status Today. Status Today成立于2015年,时间虽然不长,但能力

Django Book

The Django Book 2.0--中文版 第一章:介绍Django 本书所讲的是Django:一个可以使Web开发工作愉快并且高效的Web开发框架. 使用Django,使你能够以最小的代价构建和维护高质量的Web应用. 从好的方面来看,Web 开发激动人心且富于创造性:从另一面来看,它却是份繁琐而令人生厌的工作. 通过减少重复的代码,Django 使你能够专注于 Web 应用上有 趣的关键性的东西. 为了达到这个目标,Django 提供了通用Web开发模式的高度抽象,提供了频繁进行的编程

Jquery 和 Js

jQuery [一]  jQuery 1: javaScript和 javaScript库: (1) javaScript自身存在的3个弊端:复杂的文档对象模型(DOM),不一致浏览器的实现和便捷的开发,调试工具的缺乏 (2) javaScript库: prototype(...)是最早成型的 javaScript库之一,但是由于 prototype成型年代较早,从整体上对面向对象的编程思想把握的不是很到位,导致其结构松散. Dojo(...)的强大之处在于Dojo提供了 javaScript库