C#学习笔记

/*
文件名称:C#(C Sharp)学习笔记
C#特殊的小聪明注释
/*
...只需去掉开始/* 即可去电整个注释
//*/
*/
什么是C#:

运行C#代码必须满足两个条件: 机器上安装了.net framework 安装了vs(或者 sharpDelelop)

.net framework = {
.net framework 类库(FCL)
什么是类库FCL,就是微软给我们写好的一堆方法,用来实现windows山的各种基本的 功能,我们只需要调用就行
构成:
1.web 窗体 web service and winform(标签层)
https://www.360docs.net/doc/314491088.html, xml类(较底层 公用层)
3.基本框架类(最底层 公用层)
//注意,因为https://www.360docs.net/doc/314491088.html, 和xml类都是底层的是1中的底层,因此当要将c/s程序改成b/s,只需要修改表现层就可,不需要修改数据库的访问方法和xml的访问方法
公共语言运行库 (CLR)
功能:解释中间语言,执行程序(由.net平台语言写的程序,表面上生成了exe文件,实际上内部是MSIL中间语言,双击exe,该exe的代码就被机器上的.net Framework CLR托管了,CLR将其转化为机器语言进一步执行)
构成:
1. CLS (通用类型系统)定义了一种基本类型(有什么)
2. CTS 公共语言规范(定义了各种.net平台语言翻译为中间语言MSIL的规则)
3. JIT 即使编译器(就是在exe程序运行的时候才执行编译的一个组件,当双击exe文件,JIT就将中间代码转化为计算机可以识别的机器语言)

赘述:
各种.net的跨平台(微软平台)就像各国的外贸交易,日本 韩国 俄罗斯都要将自己的本国语言翻译为中文才能进行交易:
那么CLS就规定了翻译成中文要注意哪些语法
那么CTS就规定了翻译成中文要注意 中文中有哪些汉子可以使用(通用类型系统)

}

.net是:多种语言,一个平台(微软平台,包括微软的wp7手机平台,windows平台,微软平板电脑微软服务器iis)
为什么微软的.net不能像java一样夸平台使用:因为如果可以在别的操作系统上使用,用户就不一定选择微软的操作系统。自身利益受损

java: 是一种语言,多个平台(可以在任何平台上运行,linux,任何手机 windows,不局限于某个公司的平台)


什么是.net 技术的平台无关性和 语言无关性
net可以夸平台(当然,这个平台是微软自身的平台包括windows,手机wp 或者平板电脑)
因为.net 是由。net framework类库和公共语言类库CLR组成
所有。net平台上的语言C# https://www.360docs.net/doc/314491088.html, https://www.360docs.net/doc/314491088.html, 和其他语言都将转化成MSIL微软中间语言,这个语言有通用的语法
计算机不必立即理解,然后再由公共语言将其转化为一个相应平台上的执行指令(如果.net Framework 安装在wp手机,那么CLR会被转化为手机系统可以理解的指令,进行执行)

有了MISL微软

中间语言,所有基于.net平台的语言开发的类库和程序都是可以相互调用的


一个基本的C#程序
using System; //引用命名空间
namespace First_Csharp //定义一个名称为First_Csharp的命名空间
{
class Program //定义一个名称为Program的类
{
public static void Main( string[ args ) //定义一个叫Main的方法
{
Console.WriteLine("Hello World!"); //行输出 Hello world!
Console.ReadLine(); //停留在Dos界面
} //end class
}
} //end namespace

Main在我们的C#中很重要,重要到没有Main不能运行,是我们项目的入口方法
和C语言一样,程序从Main方法开始执行,Main结束执行,所有初学者写程序就应该写在Main方法中
一个程序,最多只有一个Main方法,也可以没有

C#的程序的基本结构
命名空间
{

{
方法
{
//TODO:我们写的程序
}
}
}


C#的文件后缀名是 .cs 这是一个类文件

C#解决方方案文件夹结构

解决方案文件夹
解决方案索引文件.sln ( sln == solution )
项目1文件夹
xxx1.csproj ( 项目文件 )
引用
System;
System.Linq;
Properties(属性)
Program.cs ( 类文件 )

项目2文件夹
项目3文件夹

打开一个程序源文件必须要打开解决方案(或者项目,也不推荐只打开项目),不能只打开项目文件夹里的xxx.cs文件,否则光打开这个文件只能看不能运行
保存一个程序,必须保存所有的文件(ctrl+shift+s)不能只保存当前编辑的文件(ctrl+s)


概念:C#和.Net
.Net是一个 .Net Framework框架 是一种平台 是一种技术 是一类技术
C#是一种编程语言 (是C家族里的一种,由C C++派生而来)
java既是一门语言也是一个平台

.Net可以开发
{
桌面应用程序 winform
Internet应用程序 https://www.360docs.net/doc/314491088.html, /web.service
手机开发 wp7
( 手机嵌入式应用程序(借助 Win CE) )
}

在.net这个平台上开发桌面应用程序,叫做开发winform
winform 使用的技术是.net技术 C#语言
在.net这个平台上开发的internet应用程序,叫做https://www.360docs.net/doc/314491088.html,
在.net这个平台上开发的手机应用,叫做wp7

架构:
c/s: 客户机/服务器(client/server)
b/s: 浏览器/服务器(browser/server)

中国法律规定:以研究学习为目的破解编译,不需要对作者支付任何费用

VS2010的使用
安装:
启动:
设置:
字体,颜色,行号 ==》工具-选项
创建:
解决方案:表示一个大的工程
项目: 表示一个解决方案里的具体的项目
文件:保存着我们写的程序
两者关系:解决方案由项目组成,一个个项目组成了一个解决方案,一个个文件组成了项目
调试运行:快捷键 F5
保存项目:
应该全部保存,不能只保存当前正在编辑的文件

添加新的项目:
在解决方案上面点击右键-添加; 或者新建项目(添加解决方案)


选择要运行的项目:vs只运行项目管理器中名称加粗的项目,要运行其他项目只要在项目上点击右键选择 设为启动项目即可
也可以在解决方案上点右键,选择属性,设置为启动项目为当前项目,那么可以设置当前编辑的项目为启动项目

卸载项目:为了减少项目生成的次数,为了排除错误。 在项目上点击右键选择卸载项目即可

--------------------
计算机的基本使用技巧
常用键介绍 Home / end / pageup / pageDown / shift(shift + 前面几个 光标经过的地方都会选中)
( CTRL + hOME Ctri + end 直接将光标移动到文档的最前面的最后面 )
错误的删除习惯:一个一个删除字符
正确的删除习惯:
用鼠标:直接选中一行,然后按del 或者backspace删除
不用鼠标:end跳到一行最后,然后安歇shift + home键,选中改行所有文字,再按del或者backspace
delete删除光标后面字符,backspace删除光标前面的字符
使用 Ctrl + C V A : 学会用快捷键复制代码 粘贴代码和全选代码
使用Ctrl + C 能复制错误对话框中的错误信息, 这是我一直不知道的技巧
插入、覆盖模式: insert键
半角 和 全角符号的问题:半角:正确。 全角:错误
vs窗口的拖拽
遇到错误不要惊慌
使得代码可以折叠(目前为止,是C#特有),使用实例:
#region 第一个练习题

#endregion


保存源代码(交作业):
打包压缩整个解决方案文件夹

==================================================

开始学习编程语言:
//区别:
Console.WriteLine("Hello World!"); 换行
Console.Write("Hello"); 不换行
//注意:Console.writeLine() 是可以输出单个字符的 Console.WriteLine('h');


//Console.ReadKey() 和 Console.WriteLine() 的区别
Console.ReadKey(); //读取用户按一个键,等待用户按一个键
Console.ReadLine(); //等待用户输入一行字符,输入完毕按回车结束

第一个程序总结:
每一句话都必须以分号结束
程序的exe可执行文件在 项目/bin/xx.exe, 修改后保存不会更新可执行文件
必须:1. 菜单栏 生成-生成解决方案(F6),生成的时候会自动检测错误
2. 直接运行程序(F5)运行的时候也会检测错误

因此,在开发过程中,F5和F6是经常用到的。写完一段代码按F6,没有错误继续写,然后按F5运行一下

注释:对我们写的程序进行解释
块注释:/* */
行注释://
文档注释:/// 在类或方法前面敲三个/ 自动生成方法注释,在中间填写注释内容

注释是很重要的,无论是在考试还是自己写程序的时候必须要写注释,这是看一个程序员是否

有良好的编程习惯的重要方面
所以,下次遇到考试或者写程序,必须要写注释,实在没有注释可写的,也要挑几个地方写写

如何快速输出一行打印语句 vs里直接输入 cw 然后按两下tab ,vs会自动补全,这个就是代码段的功能

内存:内存就是随机存储器 RAM 断电后里面的数据都会消失


变量:
将申请一个变量和开一个房间是相似的

变量的命名规则
两条规则
0.完全可以使用中文作为标识符,但是不推荐使用。C#是utf-8编码格式支持多国语言,因此可以用中文作为变量名 int 年龄 = 25;
但是不推荐使用中文:因为中文麻烦,而且可移植性差,不能用在英文版本的操作系统上,容易出现乱码等问题
1.必须以字母或者@ 符号开头, 不能以其他字符开头
2.后面可以跟字符 数字 下划线
三条注意
1.不能和关键字重复
预防方法: 1. 当输入关键字后 编辑器有加亮提示 2. 92个关键字全部背下来(不推荐)
2.大小写区分
3.在同一个方法中同一个变量名是不能被重复定义的(以后再特殊情况下可以重复定义(可能是研究变量作用域问题的时候))

变量的命名规范
Camel 命名法
Pascal 命名法
变量的命名一定要有实际含义:不能光用a b c d e f 这样的简单的没有意义的字母

在方法中定义变量要使用Camel命名法(涉及英文单词的缩写全部用大写)

变量一定要先定义 赋值 后使用
这个使用就是读取他里面的内容 比如输出他就要读取变量里面的值然后作为参数
使用 == 读取

C#里的变量如果只定义没有赋值,那么也是不能使用的,他会报错,如:int a;Console.Write(a);(报错)因为没有赋值过的变量的值是不确定的,C#报错就体现了他的安全性。
但是数组不一样,数组是用new关键字创建的。因此数组实际上是一个array类派生而来的一个类,在array类中有一个构造函数,能自动将变量初始化


判断一个表达式是什么类型的表达式的判断依据
以什么符号连接起来的表达式就是什么表达式
f = (1, 2, 3); 这个表达式是以=连接起来 f 和 (1, 2, 3)构成的,因此他是一个赋值表达式
1,2,3; 这个表达式是以,连接 1 2 3 而构成的一个表达式 因此这是一个逗号表达式

C#中的关键字
共92个 在这个学习笔记同目录下的截图里有

预定义类型:
object
string
简单类型
数值型
整数类型
8-bit
sbyte byte
16-bit
short ushort
32-bit
int uint
64-bit
long ulong
浮点类型
float
double (精度15到16位(16为有效数字) 16位后的精度丢失,如果表示一个很大的钱的数字,后面的零头会省略,损失惨重 范围5e-324 ~ 1.7e308)
deci

mal (精度28~29位,范围是1e-28到7.9e28 范围没有double大 ) ( 专门用在财务上的数字 )
//decimal 和 double 如果在表示10位以下的金额,那么没有差异
//在C#开发环境中,直接写一个有小数点的数字,这个是double类型的
//如果 decimal money = 1000.25 是错误的, 因此 正确的写法是 decimal money = 1000.25M 或者 declmal money = 1000.25m
非数值型
bool
char( 必须要有一个字符 char ch = ''是错误的 char ch = 'A'; )


5种常用的数据类型(C#的编码格式是utf-8是,这种编码格式是支持多国语言的,因此可以用来显示中文,自然char类型是两个字节就是为了其他除英文字母以外的字符设计的 char ch = '和'; 就是这样立理解的)
int --> 3 4 5 6
char --> 'a' 'A' ' ' 'G' '和' C#的char类型表示一个字符,占两个字节,char a = 'a'; 只使用了一个字节另一个字节不会用空格填补,char数据类型的两个字节是为中文字服务的,这个和c语言是不一样的
string --> "he" " " "shi" "wei"
double --> 123.2 121.5 ( 范围1e-307 ~ 7.9e308 精度15 16,一般存储较大数目的钱的时候,会损失精度, 因为计算机会自动将数字转化为1.236e28 这样的小数)
decimal --> 1000.25M 125.4m(专门存储金额货币的一个数据类型 范围1e-28~7.9e28 精度28到29位)

C#的类型安全的含义
//类型不同的变量之间的值不能相互赋值,所有的变量只能使用合适的类型数据,或者在前面加上和C语言一样的强制类型转换(int)。这就是C#的类型安全
//如果声明一个变量,没有被赋值或者赋值不正确,那么是无法通过编译的。(但是在类里面,则自动赋初值)C#的这一个重要的特点保证了类型的安全
变量的三种声明方式
int a; a = 3;

int a = 3, b = 3, c = 3;

赋值表达式
a = a + 1;


连字符和占位符


连字符 + (+在C#中有两种意义,1.数学中相加运算 2.连接两个字符串)
string name = "heshiwei";
Console.WriteLine("Hello" + name + "\n");
+运算符的意义:
1.当+两边都是数值类型表达式的时候,+表示的就是数学中的加法运算
2.当+两边有一个是字符或者字符串类型,那么+代表连接的意思(这个其实也可以从类型转化的角度来理解,和C语言中的隐式类型转化有点类似)
特别注意:当 数值 + 'a'(字符) 那么这个字符会被自动转化为ASCII,然后然后打印出来(不会和前面的数值相加)
当 字符串或者字符 + 'a'(字符) ,那么这个字符会被当成一个真正的字符,并不会找出他的ASCII码

C#的输出可以使用占位符
( Console.Write()中输出的永远都是第一个参数,后面的参数都会进行运算用来替换第一个参数里的占位符 )
Console.WriteLine( "MyName is{0}, and my address is {1}", name, age

);
{0}代表后面变量列表中的第一个变量
{1}代表了后面变量列表中的第二个变量
{2}代表了后面变量列表中的第三个变量

{}中的数字
在后面没有对应的变量,那么系统报(运行时候出错,什么是运行时错误,就是语法是没有错误的,但是在运行时出现了错误叫做运行时错误)
变量列表总的变量数目比{}中使用的多,那么不会出错
{}同一个占位符可以重复使用
总结:定义的一定要比使用的多,定义了可以不使用,但是不能使用没定义的(运行时错误)。使用时候 顺序是可以混乱的

其他:参数的换行不能在参数的内部,可以在连个参数之间换行,C# 不可以用些 a = 1,b = 2; 这样的逗号表达式


C# 不可以用些 a = 1,b = 2; 这样的逗号表达式


如何接收用户输入的字符串(用户在屏幕上的所有东西,都是字符串)
string name;
Console.Write("Please input your name: ");
name = Console.ReadLine();
Console.WriteLine("your name is {0}", name);

如何接收用户输入的数值
int number = Convert.ToInt32( 字符串数值 );

//例程:用户输入语文数学成绩,输出和与平均成绩
int chinese = Convert.ToInt32( Console.ReadLine() );
int math = Convert.ToInt32( Console.ReadLine() ); //如果遇到用户非法输入,就报运行时错误,提示非法输入

Console.Write("您的成绩为:" + chinese + math );

Convert类提供了各种数据类型的相互转换,Convert不再是内存级别的转换而是考虑数据意义的转换
Convert.ToString是所有数据类型都有的方法,所有的数据类型都可以被转换为string类型


try{ }catch{ } //C#的错误捕获机制

将有可能出错的代码放在try中,如果try中的代码没有出现运行时错误,那么catch的代码不会被执行
假如try中的某一行代码出错,那么该行代码以后的代码都不会被执行,立即跳转到catch中错误处理代码

//一个典型的处理用户输入非法的程序
while (true)
{
try
{
Console.Write("请输入您的语文成绩:");
int chinese = Convert.ToInt32(Console.ReadLine());
Console.Write("请输入您的数学成绩:");
int math = Convert.ToInt32(Console.ReadLine());

Console.WriteLine("您的总成绩为:" + (chinese + math));
break;
}
catch
{
Console.WriteLine("您输入的数字可能非法,请重新运行!");
}
}

Console.WriteLine("感谢使用,要退出请关闭软件!");
Console.ReadKey();


什么是转义字符:转移字符就是一个\后面加一个字符,这就是转义字符
C#中的一个

字符表示的是一个utf-8字符不再区分中英文了
C#中所有的转义字符
\’ 单引号符
\” 单引号符
\\ 反斜线符"\"
\0 空字符(Null)
\a 鸣铃
\b 退格(\b放在字符串的最后是显示不出效果的,因为)
\f 走纸换页
\n 换行
\r 回车
\t 横向跳到下一制表位置
\v 竖向跳格(垂直制表)

详解\b
\b就是将光标键退回一个位置,如果后面有字符其他字符的话(目前除了\n) 后面的字符会覆盖退回的字符但是\n就不会覆盖而是直接输出

详解\t
\t是多个空格一起输出,具有多个数字对齐的功能,当数字宽度不一样的时候,\t会自动调整空格的数量

C#里当\后面是一个不可转义的字符时候(除了上面那些可转移的字符以外其他都是不可转义的字符),但是在C语言中,没有定义的转移字符 转义了会原样输出

在字符串前面加上@ 符号有两种意义
1.表示这个字符串中的转义字符不再转义(可以用来显示一个 比较麻烦的路径)
这种情况下,如果还想输入字符串中的"" 可以使用两个" 表示一个"(前提是字符串前面有@ )
""就表示一个" 这个和C语言里的%% 表示一个% 一样 是一个特殊的规定
2.表示字符串可以换行(直接在字符里敲回车就能直接给你输出)

算术运算符
+-*/% 要求操作符两边的操作数的数据类型相同,并且运算结果的数据类型也要相同

数据类型的隐式转换问题
前提:运算符两边的数据类型一致才能做运算

条件:隐式转换必须是相互兼容的数据类型 必须是一边的表示范围大 一边范围小。那么隐式转化后不丢失精度

比如: = 赋值号两边的数据类型一直才能做赋值(否则就报错) + 两边的数据类型一直才能做+号
因此当两边的数据类型不一致时,编译器会自动将互相兼容的数据之间相互转化,在互相兼容的范围内,所占字节数小的数据类型会被转换为字节数大的数据类型
如 float -> double
如果两边的类型不兼容,比如int number = "heshiwei"; 那么= 两边的数据类型是不一致并且不兼容的,那么编译器就会报错
但是 + 的两边的数据类型可以是数值和字符串 "heshiwei" + 123 这个很特殊,这种特殊情况下,数值会被转化为字符串 "123" 然后用+运算符将两个字符串相连
当运算符两边的数据类型如果不一样,那么

double 和 decimal 虽然都是数值的数据类型,但是他们并不能互相转换。
因为double能表示的范围比decimal大,因此double转换成decimal要丢失范围;
因为decimal的精度高于double,因此decimal转换成double要丢失精度

基于此,他们之间是不能转换的,也就是他们的数据类型不兼容

总结:在C#中,凡是丢失数据(范围 精度)的转换都不能自动完成,只能强制完成。
只有不丢失精度的转换才能自动转换(因为如果会丢失精度的转换,如果自动完成了,用户都不知道那么出错了)
比如int a = 3.14; 这样的写法在C#中是要报错的。这就是C#类型安全的一个方面,凡是丢失精度丢失数据的转换都不会自动完成,如果运算符两边数据类型不一致就会报错。因此写了
int a = 3.14; 这样的如果不能自动转换,那么只能报错了。所以再次强调C#是一种类型安全的编程语言
在C语言里,int a = 3.14;是可以完成的,但是这是不安全的转换。是不好的地方

强制类型转换:数据类型一定要兼容 int a = (int)3.14;

再次总结:
数据类型兼容
{
隐式转换: 数据类型字节小的 -> 数据类型字节大(由编译器自动转换)
强制转换: 没有转换方向的限制(但是类型必须兼容)(由用户手动完成)
}

对于一个表达式,如果有一个量为double 那么整个表达式的值就是double

C#的数值计算也很有意思(充分体现了类型安全)
C#完全改进了C语言的浮点数计算的弊端
1.Console.Write( 10 / 3.0 ); 因为10/3.0的结果是一个无限循环小数,对于无限循环小数 C#是保留到小数点后14~16位(通常为他们之间的15)(1/3.0保留14 1/33.0等保留16位){为什么呢,因为1/3.0的结果有整数部分,那么精度的一位就要被用作整数部分,剩下的14位,而1/33.0 没有整数部分,那么15位的精度全部用来表示小数。因此会显示15个小数}
2.对于double number = 12.567; Console.WriteLine( number * 3 ); 那么显示的结果就是一个37.701; 有多少就位就显示多少位,不像C语言那样一股脑显示6位
3.对于 double number = 1 / 3.0; Console.Write( number * 3 );这样的数,显示的是1 说明C#在数值运算方面更精确了,很大程度上掩盖了C语言的精浮点数近似值的问题

运算符
++
--
写程序的时候尽可能使用++ 和-- 不适用a = a + 1;这样复杂的写法,因为a = a + 1; 要从变量里读取值到累加器中+1后再赋值给这个变量本身
但是使用++ 即可直接读取值+1即可

+=
-=
*=
/= 的效率也要高于a = a + 3;这样的代码

到目前为止我们能改变变量里面的值的知识++ 和-- a+=3 之类的。必须有赋值号才能改变值

在C#中有6个关系运算符
> < == != <= >=

布尔数据类型 bool 只有两个值true false
C#中的真假就是True and False 不是0 或者 1懂吗? Console.Write( 1 > 1 );输出一个False

布尔类型的只有相同的数据类型才能比较 string 和 int 才能比较
C#中的两个string类型的字符串只能用== != 比

较,不能比较他们的大小

逻辑运算符
&& || ! 逻辑运算符两边只能写true或者false,才能进行运算。两边的操作数的表达式的值不能是整形,这在C语言中可以但是在C#里是要报错的
C#对类型的控制有着很严格的规定,这就是C# 类型安全
true || false (ok 可以这么写)
0 && 1 (no 不可以这么写)

int a = 100, b = 50;
bool isRight = a > b;
Console.WriteLine( isRight ); 这里的a>b 的结果是一个bool类型,因此可以放到bool类型的变量isRight中




C#面向对象的一些基础知识
------------------------------------------------------------------------
以后再重复看一遍做一做笔记,现在这些笔记是粗略看过一遍之后的笔记。以后慢慢完善

静态方法不能访问动态的字段或者调用动态方法
动态方法可以调用静态的字段或者方法,但是不能使用this关键字
静态的方法只能以类名.方法名 静态的字段只能以类名.字段名的方式访问

当我们声实例化一个类时,系统会对定义的字段进行初始化

使用构造方法的好处
1.对多个字段不用一个一个赋值
2.可以保证用户在new一个对象的时候必须对某一个属性进行赋值
3.可以让用户在实例化对象的时候就赋一个初值,之后不能改动,也不能读取。必须使用构造方法
//构造方法解决的问题:某一个值必须要在实例化的时候定义 不能不定义,而且之后都不能改变这个值。减少写为属性赋值的代码

当我们定义好一个类后,如果没有写构造方法,那么系统会给我们加上一个默认的没有参数的构造方法
在这个构造方法中什么也不做 什么也看不到。这就是为什么实例化的时候要用() 如:Student zaPerson = new Student(); //这个括号表明该类存在一个构造方法

构造方法是方法名和类名相同的并且没有返回值有访问级别(默认和字段不写访问级别的一样 都是private)的方法,因为他本身就没有返回值,也就不必说明void了,void的作用是为了告诉程序,方法原先可以有返回值的 但是这个方法偏偏没有返回值,所以要写void
而构造方法本身就是一个没有返回值的方法,因此系统知道这个是构造方法 必然没有返回值,因此也不需要再次声明他没有返回值 所以不用写void了。一旦在一个类中添加了自定义的构造方法那么这个构造
方法会替换原先系统默认的构造方法了

如果定义了构造方法,那么原先的构造方法就失效了。当我们执行
Student stu = new Student(); 的时候,同时也调用了构造方法,那么构造方法必须要为public才能不出错
//因此,定义构造方法的时候必须给构造方法添加一个public访问级别

对于所有的变量 方法 类 对象 以及其他一些元素。我们都可以

使用vs的右键转到 定义 来看他到底是怎么定义的

在构造方法中
private string name;
public Student( string name )
{
https://www.360docs.net/doc/314491088.html, = name; //当方法中的参数名和字段名称重名时,那么在该方法中,始终认为name为参数(这就可以理解为变量的作用域),而解决的方法就是写一个this关键字 指代本对象中的字段
}

如果想定义了只读属性 并且只能在实例化对象的时候为其赋值
那么必须完成以下几个步骤
1. 设置该字段的值为 private 如: private string name;
2. 为其设置相应的只读属性 如:
public string Name
{
set{ return name; }
}
3.在构造方法中有相应参数为其初始化

构造方法的重载(任何方法都是可以重载的)
定义两个方法名一样的方法,并且参数类型或者参数个数 或者两个都不同,那么系统就会自动根据我们调用方法的时候写的参数的样子就知道我们在调用哪个版本的方法,自动找到对应版本的方法。

认识类关系图(类图)
1. 通用类图 ()
类名:Student
------------------------
属性:-name:string
+Name:string
------------------------
方法
-SayHello(string):void

2.C#专用类图(解决方案管理器 - 项目节点上 点右键 选择生成类关系图,即可看到)


析构方法
作用;析构方法是在该对象被释放前最后一次执行的方法
析构方法是在垃圾回收机制回收或者当我们结束程序的时候,调用的方法,用来清理对象资源
但是,C#里有垃圾回收机制,会不定期的自动回收那些不再使用的内存资源,那么在C#里就很少用到了析构函数
析构函数无法继承或者重载,无法调用析构函数,因为他是被自动调用的,析构函数没有访问级别修饰符,也没有参数

如何定义:
和类名一样 前面加一个~ 表示这是一个析构函数,没有参数

params 可变数组 关键字
如:public static void WriteLine(string format, params object[] arg);
因此console.WriteLine();的参数个数是不限制的,因为除了第一个参数会被传递给string format这个形参外,其他参数都会被系统打包成
一个数组传递给函数。object是所有类型的父类(基类)因此可以接受任何类型的变量

可变数组作为参数的时候必须写在参数列表的最后

命名空间
作用:解决类名重复的一个逻辑空间

不同命名空间下的类相互之间不可见,除非{1.写全称 命名空间.类名 2.用using引用命名空间}

命名空间可以嵌套定义 但是不能直接就嵌套定义,不然代码混乱。
namespace Student.StudentSub //表示定义一个studentSub 这个命名空间在Student 下
{

}

string类详解
int char double decimal ... 这些都是struct(结构)
而在所有的数据类型中

唯独string是一个class(类)

string可以看做 char的只读数组,可以使用char数组的遍历来依次访问string
string s = "heshiwei";
for (int i = 0; i < s.Length; i++) Console.WriteLine(s[i]); //可以这样遍历数组
但是string里的字符一旦被确定,那么就无法通过索引器(就是数组下表)修改

如果非要修改字符串的某个字符,那么可以通过曲线的方法修改
string s = "hello,world"; //首先用字符串特殊的""(相当于new) 实例化一个字符串对象在内存空间中,然后将返回的地址赋值给一个字符串存放字符串对象地址的地址变量
//但是字符串一旦被创建,就等于是创建了一个只读的char数组,不允许直接修改这块内存中的字符

char[] chs = s.ToCharArray() //ToCharArray()方法是字符串对象所特有的,是一个非static方法,必须通过实例名.ToCharArray()访问,他的功能是
//在内存空间中开辟一块和string s 大小相同的数组,然后把string s所代表的那个内存空间的值取出来,放到这个数组里面去,这个字符数组并非字符串而是一个字符数组

s = s.string( chs ); //调用一个string对象的构造方法string(),参数是一个字符数组的地址,这个构造string对象的构造方法得到字符数组的首地址后,接着开辟一块相同大小的字符串空间,把这个字符数组中的字符一个一个放到字符串空间去,构造了新的字符串,然后再把新字符串所在的地址通过return返回给被调函数,通过= 再次赋值给s(s一开始通过string s 定义,就是用来存放字符串地址的一个变量,那么这样一来刚刚好,哈哈哈)






以下是杨中科的C#面向对象笔记
----------------------------------------------------------------------------------------
面向对象和对面向过程不是敌人,是互补互助的关系

对象就是类的实例
字段(Field) 和类相关的一些变量
类不占内存,对象才占内存
方法,方法就是累能够执行的动作
类的继承: 电脑这个类是电器类中继承的,子类是父类的更进一步具体化

成员访问级别
public (任何地方都可以访问)

private (只要本来才能访问)

protect (只要在子类中可以访问)

internal 本项目中可以访问,类的级别的的默认访问级别(类的默认访问级别)

所有的字段就尽量都要写public,都应该写private

无论是在属性set还是在构造方法中验证用户输入值的合法性,不能只在不合法的情况下将原有的值设为0,而是要学会直接拒绝这个值,如下
class Student
{
private string name;
private int age;

public string Name
{
get{ return name; }
set
{
if ( value < 0 )
return; //如果遇到
else
this.age = value;
}
public Student( int

age )
{
this.age = age < 0 ? return : age; //如果不符合,不要直接将this.age的值设为0,因为如果已经有方法为this.age赋值了,那么这个动作会覆盖前面的值,变成0
}
}
}

相关文档
最新文档