数往知来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 = ; 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#之面向对象准备〈一〉的更多相关文章
- 数往知来C#面向对象准备〈二〉
面向对象(OOP→Object-Oriented Programming) 1.什么是面向对象? 一种分析问题的方式. 2.面向对象三大特征: 封装(隐蔽代码实现/复用/修改方便).继承.多态. 3. ...
- 数往知来C#面向对象〈三〉
C# 基础方法篇 一.复习 1)方法的重载 方法的重载并不是一个方法,实际上方法的重载就是一些不同的 方法,目的是为了方便程序员编码,所以将功能相近的方法命名相同 根据参数,编译器自动的去匹配方法体, ...
- C#中List〈string〉和string[]数组之间的相互转换
1,从System.String[]转到List<System.String> System.String[] str={"str","string" ...
- 〈一〉ElasticSearch的介绍
目录 什么是ElasticSearch 核心能力 ES的搜索核心 搜索引擎选择 搜索的处理 补充: 小节总结: 基本学习环境搭建 如何操作ElasticSearch 下载.安装和运行(Based Wi ...
- 〈二〉ElasticSearch的认识:索引、类型、文档
目录 上节回顾 本节前言 索引index 创建索引 查看索引 查看单个索引 查看所有索引 删除索引 修改索引 修改副本分片数量 关闭索引 索引别名 增加索引别名: 查看索引别名: 删除索引别名: 补充 ...
- 〈三〉ElasticSearch的认识:搜索、过滤、排序
目录 上节回顾 本节前言 文档的搜索 URL参数条件搜索 请求体条件搜索 语法与示例: 补充: 小节总结: 文档的过滤filter 语法与举例: filter与bool constant_score ...
- 〈四〉ElasticSearch的认识:基础原理的补充
目录 想想我们漏了什么 回顾 补回 集群的建立 集群发现机制 配置文件 健康状态 补充: 小节总结 分片的管理 梳理 分片的均衡分配 主副分片的排斥 容错性: 数据路由 对于集群健康状态的影响 小节总 ...
- 《Linux内核设计与实现》CHAPTER17阅读梳理
<Linux内核设计与实现>CHAPTER17阅读梳理 [学习时间:3.5hours] [学习内容:设备类型,模块,内核对象,sysfs] 个人思考部分见[]标出的部分 一.课堂讲解整理& ...
- Jquery 和 Js
jQuery [一] jQuery 1: javaScript和 javaScript库: (1) javaScript自身存在的3个弊端:复杂的文档对象模型(DOM),不 ...
随机推荐
- Apache源码分析资源
关于作者张中庆, 目前主要的研究方向是嵌入式浏览器,移动中间件以及大规模服务器设计.目前正在进行Apache的源代码分析,计划出版<Apache源代码全景分析>上 下册.Apache系列文 ...
- css元素z-index设置为什么不起作用?
元素位置重叠的背景常识 (x)html文档中的元素默认处于普通流(normal flow)中,也就是说其顺序由元素在文档中的先后位置决定,此时一般不会产生重叠(但指定负边距可能产生重叠). 当我们用c ...
- 让Windows蓝屏死机
ssdt 随便一个函数入口改90就蓝了 ------------------------------------------------- program Project2; uses Windows ...
- PowerDesigner中转换物理模型时的命名转换
原文:PowerDesigner中转换物理模型时的命名转换 最近在使用PowerDesigner建模数据库,在使用中积累了一些遇到的问题和解决办法,记录下来,希望对遇到同样问题的朋友有所帮助. 早 期 ...
- dubbo-admin管理平台搭建
参考:http://blog.csdn.net/u013142781/article/details/50396621 一.前言 dubbo的使用,其实只需要有注册中心,消费者,提供者这三个就可以使用 ...
- swfupdate flash上传工具
引用:http://baike.baidu.com/view/1332553.htm 下载地址:http://code.google.com/p/swfupload/ 什么是SWFUpload? SW ...
- 一些非常有用的html,css,javascript代码片段(持久更新)
1.判断设备是否联网 if (navigator.onLine) { //some code }else{ //others code } 2.获取url的指定参数 function getStrin ...
- java匿名对象
java学习面向对象之匿名内部类 之前我们提到“匿名”这个字眼的时候,是在学习new对象的时候,创建匿名对象的时候用到的,之所以说是匿名,是因为直接创建对象,而没有把这个对象赋值给某个值,才称之为匿名 ...
- C++STL之map的基本操作
STL中基本的关联式容器有map和set,它们都是以红黑树作为其底层的结构,具有非常高的查找.删除效率,内容会按照键值自动排序. 使用map的注意事项: 1.关联式容器的键值是不允许修改的,所以永远不 ...
- 概述什么是OSGi框架
现 在越来越多的Java开发人员在谈论OSGi是有其道理的.在几年前上学的时候我进行了比较多的Eclipse插件开发,当时就亲身感觉到Eclipse 插件体系的灵活与强大,而该体系与OSGi也可谓一脉 ...