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 = ; i < ;i++)
{
for(int j = ;j<;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('.') > - || strNumB.IndexOf('.') > -)
{
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 = ;
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 != "" && optType != "")
{
Console.WriteLine("您输入的操作类型有误,请重新输入~~");
continue;
}
do
{
Console.WriteLine("请输入要操作的金额(以元为单位):");
string strMoney = Console.ReadLine();
double dMoney = ; 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 "":
SaveMoney(money, ref count);
return true;
case "":
{
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 = ; i < dogsNameArr.Length; i++)
{
Console.WriteLine("第" + (i + ) + "只小狗的名字为:" + dogsNameArr[i]);
}
} static void BuyDogs(string masterName,params string[] dogsNameArr)
{
for (int i = ; i < dogsNameArr.Length; i++)
{
Console.WriteLine(masterName + " 的第" + (i + ) + "只小狗的名字为:" + dogsNameArr[i]);
}
} static void BuyDogs(string masterName, string masterName2, params string[] dogsNameArr)
{
for (int i = ; i < dogsNameArr.Length; i++)
{
Console.WriteLine(masterName + ",masterName2=" + masterName2 + " 的第" + (i + ) + "只小狗的名字为:" + dogsNameArr[i]);
}
}
}

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

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

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

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

    面向对象(OOP→Object-Oriented Programming) 1.什么是面向对象? 一种分析问题的方式. 2.面向对象三大特征: 封装(隐蔽代码实现/复用/修改方便).继承.多态. 3. ...

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

    C# 基础方法篇 一.复习 1)方法的重载 方法的重载并不是一个方法,实际上方法的重载就是一些不同的 方法,目的是为了方便程序员编码,所以将功能相近的方法命名相同 根据参数,编译器自动的去匹配方法体, ...

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

    1,从System.String[]转到List<System.String> System.String[] str={"str","string" ...

  4. 〈一〉ElasticSearch的介绍

    目录 什么是ElasticSearch 核心能力 ES的搜索核心 搜索引擎选择 搜索的处理 补充: 小节总结: 基本学习环境搭建 如何操作ElasticSearch 下载.安装和运行(Based Wi ...

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

    目录 上节回顾 本节前言 索引index 创建索引 查看索引 查看单个索引 查看所有索引 删除索引 修改索引 修改副本分片数量 关闭索引 索引别名 增加索引别名: 查看索引别名: 删除索引别名: 补充 ...

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

    目录 上节回顾 本节前言 文档的搜索 URL参数条件搜索 请求体条件搜索 语法与示例: 补充: 小节总结: 文档的过滤filter 语法与举例: filter与bool constant_score ...

  7. 〈四〉ElasticSearch的认识:基础原理的补充

    目录 想想我们漏了什么 回顾 补回 集群的建立 集群发现机制 配置文件 健康状态 补充: 小节总结 分片的管理 梳理 分片的均衡分配 主副分片的排斥 容错性: 数据路由 对于集群健康状态的影响 小节总 ...

  8. 《Linux内核设计与实现》CHAPTER17阅读梳理

    <Linux内核设计与实现>CHAPTER17阅读梳理 [学习时间:3.5hours] [学习内容:设备类型,模块,内核对象,sysfs] 个人思考部分见[]标出的部分 一.课堂讲解整理& ...

  9. Jquery 和 Js

     jQuery  [一]  jQuery     1: javaScript和 javaScript库:        (1) javaScript自身存在的3个弊端:复杂的文档对象模型(DOM),不 ...

随机推荐

  1. laravel加载javascript库

    一篇文章: Generating a Link to a Javascript File Problem You want your Blade template to load an externa ...

  2. 最受欢迎的5款PHP框架记录,我居然一个不知道。。。

    1. CodeIgniter Framework CodeIgniter 是目前使用最广泛的 PHP 框架.CodeIgniter 是一个简单快速的PHP MVC 框架.EllisLab 的工作人员发 ...

  3. Socket programming in C on Linux | tutorial

    TCP/IP socket programming This is a quick guide/tutorial to learning socket programming in C languag ...

  4. JVM学习笔记(四)------内存调优

    首先需要注意的是在对JVM内存调优的时候不能只看操作系统级别Java进程所占用的内存,这个数值不能准确的反应堆内存的真实占用情况,因为GC过后这个值是不会变化的,因此内存调优的时候要更多地使用JDK提 ...

  5. IOSTimer的例子留个备注

    1.创建一个定时器 ,以下是便利构造器方法,+ scheduledTimerWithTimeInterval:invocation:repeats:+ scheduledTimerWithTimeIn ...

  6. 【POJ】3134 Power Calculus

    1. 题目描述给定一个正整数$n$,求经过多少次乘法或除法运算可以从$x$得到$x^n$?中间结果也是可以复用的. 2. 基本思路实际结果其实非常小,肯定不会超过20.因此,可以采用IDA*算法.注意 ...

  7. java 基础学习

    a+b: import java.util.Scanner; public class Main { public static void main(String args[]){ Scanner c ...

  8. fil_system_struct

    /** The tablespace memory cache */ typedef struct fil_system_struct fil_system_t; /** The tablespace ...

  9. int和integer;Math.round(11.5)和Math.round(-11.5)

    int是java提供的8种原始数据类型之一.Java为每个原始类型提供了封装类,Integer是java为int提供的封装类.int的默认值为0,而Integer的默认值为null,即Integer可 ...

  10. Qt之自定义界面(QMessageBox)

    简述 通过前几节的自定义窗体的学习,我们可以很容易的写出一套属于自己风格的界面框架,通用于各种窗体,比如:QWidget.QDialog.QMainWindow. 大多数窗体的实现都是采用控件堆积来完 ...