C#学习记录

转眼几个月没更博了,把几个月前学C#的笔记发一下,就记录了点教重要的点子而已

1.打印

Console.WriteLine(); 打印

Console.ReadKey(); 按一个按键继续执行

Console.ReadLine(); //用户输入文字的时候程序是暂停的,用户输入完毕点回车,把用户输入的东西做为返回值

例:

string s =  Console.ReadLine(); 读取进去的是字符串,所以不能用其他类型接收

2.数据类型:

值类型:int、float、double、char、byte、Boolean、枚举

引用类型:DateTime、string、所有类

类型转换:

值类型:从小到大自动转,从大到小强制转,(类型),Convert.To***()

引用类型:需要有继承关系才可以转换

转换成字符串: ToString()

类型转换:cast 强转(位数有差,可能丢失)

convert 考虑数据意义的转换

C#字符串与OC一致,与C不一致,不考虑最后的\0

‘a’   是char类型,”a”是string类型

@“\\\\” @表示字符串中的\不当成转义符

3.字符串的处理

·C#中单个字符用单引号包含就是char类型,(‘a’),单引号中放且只能放一个字符。

·单个字符也可以表示为字符串,还可以有长度为0的字符串。

·使用s.Length属性可以来获得字符串中的字符个数

·string可以看做是char的只读数组。char c = s[1];例子:遍历输出sting中的每个元素。

·c#中字符串有一个重要的特性:不可变性,字符串一旦声明就不再可以改变。所以只能通过索引来

读取指定位置的char进行修改。

·如果要对char进行修改,那么久必须创建一个新的字符串,用s.ToCharArray()方法得到字符串的

char 数组,对数组进行修改后,调用new string(char[])这个构造函数来创建char数组的字符串。一

旦字符串被创建,那么char 数组的修改也不会造成字符串的变化。例子:将字符串中的A替换成a.

字符串不可变性(分配的内存块里的不可变)

string s1 = @“hello”;

char[] chars = s1.ToCharArray();

string s2 = new string(chars);

此时改变后s2为aello,而s1不变,所以只是复制了一份char数组数据,于源数据无关

如string s = “abc”; s = @“123”

最后值改变了,其实不是

要区分变量名和变量指向的值得区别。程序中可以有很多字符串,然后由字符串变量指向他们,变量可以指向其他的字符串,但是字符串本身没有变化。字符串不可变性指的是内存中的字符串不可变,而不是变量不变。

4.字符串类的常用函数

1)

·ToLower() 得到字符串的小写形式。

·注意字符串是不可变的,所以这些函数都不会直接改变字符串的内容,而是把修改后的值通过函数·返回值的形式返回。s.ToLower()与s = s.ToLower()

·ToUpper():得到字符串的大写形式:Trim()去掉字符串两端的空白。

·s1.Equals(s2,StringComparison.OrdinallgnoreCase),两个字符串进行区分大小写的比较

Ignore:忽略,Case:大小写

==是区分大小写的比较,Equals()是忽略大小写的比较

2)分割字符串

string[] str = strings.Split(‘,’); 将字符串按照指定的分割符分割成字符串数组

将字符串按照指定的char分割符分割成字符串数组(options取RemoveEmptyEntries时,移除结果中的空白字符串)

string str1 = @“aa,bb,,cc,dd”;出现空字符串

string[] str = strings.Split(new char[]{’,’},StringSplitOptions.RemoveEmptyEntries);

将字符串按照指定的string分割符分割成字符串数组(同上)

string[] str = strings.Split(new string[]{“aa”},StringSplitOptions.RemoveEmptyEntries);

3)替换字符串

string.Replace(“a”,”b”); 替换string里面的a全部成b

获取子字符串:

string.Substring(n);     从第n位开始截取string的字符串到结束,包含n

string.Substring(n,m);     从第n位开始截取string的字符串长度为m(m超过string长度会出错),包含n

4)返回bool值 使用:string.Contains

Contains(string value)判断字符串中是否含有子串value

StartsWith(string value)判断字符串中是否以子串value开始

EndsWith(string value)判断字符串中是否以子串value结束

返回int

IndexOf(string value)取子串value第一次出现的位置

枚举,跟其它语言没什么区别

枚举的意义就在于限定变量的取值范围

enum sender{a,b}

foreach (string name in names){}; 遍历,还有for,见多了

static void function(params string[] values){};

params 可变参数 参数必须是形参表中的最后一个参数

函数重载:函数名一致,参数不一致,可做两个函数使用,与有无返回值无关(不严谨)

函数的ref和out参数

函数参数默认是值传递的,也就是”复制一份”

而ref是将本身传进去,非复制

static void Main(string[] args)

{

int age = 20;

1: IncAge(age);

2: IncAge(ref age);

Console.WriteLine(age); //1打印结果为20,因为传进的只是形参值;2打印结果为21,

Console.ReadKey;

}

1:

static void IncAge(int age)

{

age++;

}

2:

static void IncAge(ref int age)

{

age++;

}

ref必须先初始化因为是引用,所以必须先“有”,才能引用,而out是内部为外部赋值,所以不需要初始化,而且外部初始化也没有用。

ref应用场景内部对外部的值进行改变,out则是内部为外部变量赋值,out一般用在函数有多个返回值的场所。

string str = Console.ReadLine();

int i;

int.TryParse(str,out i); //转换 返回值true  or false

ref应用,如交换两个数的值

5.构造函数

·构造函数用来创建对象,并且可以在构造函数中对对象进行初始化。

·构造函数是用来创建对象的特殊函数,函数名和类名一样,没返回值,连void都不用。

·构造函数可以有参数,new对象的时候传递函数参数即可

·构造函数可以重载,也就是有多个参数不同的构造函数。

·如果不指定构造函数,则类有一个默认的无参构造函数。

如果指定了构造函数,则不再有默认的无参构造函数,如果需要无参构造函数,则需要自己来写。

如:

static void Main(string[] args)

{

Person p1 = new Person();

Person p2 = new Person(“a”);

Person p3 = new Person(“a”,2);

Console.ReadKey;

}

class Person

{

public Person()

{

}

public Person(string name)

{

}

public Person(string name,int age)

{

}

}

对面可以叫做类的实例,字段就是类的状态

面向对象的三个特性:封装、继承、多态。

6.属性(可公可私有)

惯用法:属性开头字母大写,字段开头字母小写

public字段和属性的区别,属性可以进行非法设置值的判断

class person

{

private int age;

public int Age

{

set //赋值

{

if(age>0)

{

return; //如果return this.Age;造成死循环,自己给自己赋值

}

this.age = value; //value代表用户赋值过来的值

}

get //取值

{

return this.age;

}

}

}

7.异常

try{

执行到错误点后,不再往下执行

}

catch(Exception ex){

出错后执行,再跳到外面继续执行

Console.WriteLine(“数据错误:”+ex.Message+”。异常堆栈:”+ex.StackTrace);

}

throw:抛出   catch:抓住

//自定义报错异常声明

else{

throw new Exception(“自定义异常”);

}

const 常量:不会改变的量

静态变量:static 属于全局变量,无需new

在static成员中不能直接调用非static成员

例:

class Person

{

public static int TotalCount;

public int Age;

public static void number()

{

Console.WriteLine(@“{0}”,TotalCount);

//可调用TotalCount,但调不了Age

}

public void Other()//非static成员中科院调用static成员

{

Console.WriteLine(@“{0},{1}”,TotalCount,Age);

}

}

8.静态类

static class Person

{}

无法被new的类是静态类,静态类一般用来实现一些函数库。

9.命名空间

当有多个类重名时,可放不同文件夹下,或namespace不一样,使用时写全路径就行

当前类文件里有Person类

另一个文件夹名为hr,或namespace不一致的类下面有个类Person

在当前类文件里使用hr文件夹里的Person类时如下:

如果要使用的类和当前的类不在同一个namespace,则需要添加using引用

导入该文件,在顶部

using 命名空间.hr;

命名空间.hr.Person p2 = new 命名空间.hr.Person();

//就像文件的全路径一样

10.索引

C#中提供了按照索引器进行访问的方法

定义索引器的方式:string this[int index]

{

get {

return “”;

}

set{}

}

string为索引器的类型,[]中是参数列表。进行索引器写操作就是调用

set代码块,在set内部使用value得到用户设置的值;进行读操作就是

执行get代码块。

索引器参数可以不止一个,类型也不限于int,几号可以是任意类型。

11.

项目认识,从各个地方复制

String.Empty是string类的一个静态常量;

String.Empty和string=””区别不大

string s1 = "";

string s2 = string.Empty;

if (s1 == s2)<br>{

Console.WriteLine("一模一样!");

}

// 结果都是True

String.Empty和string=””一样,同样需要占用内存空间,为什么推荐优先使用String.Empty ?

string.Empty只是让代码好读,防止代码产生歧义

 用于控制一个对象是否激活,一个对象激活当且本身active=true,并且它的父结点也都active。相当API有:

  1)GameObject.SetActive

  2)GameObject.activeSelf

  3)GameObjectd.activeInHierarchy

Socket.BeginReceive 方法 (Byte[], Int32, Int32, SocketFlags, AsyncCallback, Object)

语法

[HostProtectionAttribute(SecurityAction.LinkDemand, ExternalThreading = true)]

public IAsyncResult BeginReceive(

byte[] buffer,

int offset,

int size,

SocketFlags socketFlags,

AsyncCallback callback,

object state

)

参数

buffer

Byte 类型的数组,它是存储接收到的数据的位置。

offset

buffer 参数中存储所接收数据的位置,该位置从零开始计数。

size

要接收的字节数。

socketFlags

SocketFlags 值的按位组合。

callback

一个 AsyncCallback 委托,它引用操作完成时要调用的方法。

state

一个用户定义对象,其中包含接收操作的相关信息。当操作完成时,此对象会被传递给 EndReceive 委托。

返回值

Type: System.IAsyncResult

引用异步读的 IAsyncResult

异常

Exception

Condition

ArgumentNullException

buffer 为 null

SocketException

试图访问套接字时发生错误。有关更多信息,请参见备注部分。

ObjectDisposedException

Socket 已关闭。

ArgumentOutOfRangeException

offset 小于 0。

- 或 -

offset 大于 buffer 的长度。

- 或 -

size 小于 0。

- 或 -

size 大于 buffer 的长度减去 offset 参数的值。

Socket.BeginReceive 方法 (Byte[], Int32, Int32, SocketFlags, AsyncCallback, Object)

开始从连接的 Socket 中异步接收数据。

命名空间:   System.Net.Sockets

程序集:  System(System.dll 中)

语法

[HostProtectionAttribute(SecurityAction.LinkDemand, ExternalThreading = true)]

public IAsyncResult BeginReceive(

byte[] buffer,

int offset,

int size,

SocketFlags socketFlags,

AsyncCallback callback,

object state

)

参数

buffer

Byte 类型的数组,它是存储接收到的数据的位置。

offset

buffer 参数中存储所接收数据的位置,该位置从零开始计数。

size

要接收的字节数。

socketFlags

SocketFlags 值的按位组合。

callback

一个 AsyncCallback 委托,它引用操作完成时要调用的方法。

state

一个用户定义对象,其中包含接收操作的相关信息。当操作完成时,此对象会被传递给 EndReceive 委托。

返回值

Type: System.IAsyncResult

引用异步读的 IAsyncResult

异常

Exception

Condition

ArgumentNullException

buffer 为 null

SocketException

试图访问套接字时发生错误。有关更多信息,请参见备注部分。

ObjectDisposedException

Socket 已关闭。

ArgumentOutOfRangeException

offset 小于 0。

- 或 -

offset 大于 buffer 的长度。

- 或 -

size 小于 0。

- 或 -

size 大于 buffer 的长度减去 offset 参数的值。

备注

将 count 个字节从 src 复制到 dst,前者开始于 srcOffset 而后者开始于 dstOffset。

开发人员应谨记 BlockCopy 方法使用偏移量访问 src 参数,而不是使用索引或数组上下限等编程构造。例如,如果使用应用程序的编程语言声明一个上限为零,下限为 -50 的 Int32 数组,然后将该数组和偏移量 5 传递给 BlockCopy 方法,则该方法将访问的第一个数组元素是该数组的第二个元素(位于索引 -49 处)。此外,首先访问数组元素 -49 的哪个字节取决于执行应用程序的计算机的 Edian 设置。

Add和AddRange

Add:将指定的对象添加到……中

AddRange:向……末尾,添加数组

-

在群体操作时,使用AddRange取代Add

用AddRange可以让我们要加入的东西一次性加入,而不要每次都加一次,这样显然可以加快速度。几乎所有的windows control都支持Add和AddRange两种方法。

时间: 2024-12-20 19:18:27

C#学习记录的相关文章

Python学习记录-2016-12-17

今日学习记录 模块: import os#导入os模块 import sys#导入sys模块 os.system("df -h")#执行df -h命令 cmd_res = os.popen("df -h").read()#将命令的返回结果赋值给cmd_res,如果不加入.read()会显示命令的返回加过在内存的位置 print(sys.path)#显示系统变量路径,一般个人模块位于site-packages下,系统模块位于lib下 print(sys.argu[2]

Objc基础学习记录5

NSMutableString类继承的NSString类. NSMutableString是动态的字符串. 1.appendingString 方式: 向字符串尾部添加一个字符串. 2.appendingFormat:可以添加多个类型的字符串. int,chat float,double等 3.stringWithString 创建字符串, 4.rangeOfString 返回str1在另一个字符串中的位置. 5.NSMakeRange(0,3) 字符串0位到3位. 6.deleteCharac

Windows API 编程学习记录&lt;二&gt;

恩,开始写Windows API编程第二节吧. 上次介绍了几个关于Windows API编程最基本的概念,但是如果只是看这些概念,估计还是对Windows API不是很了解.这节我们就使用Windows API 让大家来了解下Windows API的用法. 第一个介绍的Windows API 当然是最经典的MessageBox,这个API 的作用就是在电脑上显示一个对话框,我们先来看看这个API的定义吧: int WINAPI MessageBox(HWND hWnd, LPCTSTR lpTe

Windows API 编程学习记录&lt;三&gt;

恩,开始写API编程的第三节,其实马上要考试了,但是不把这节写完,心里总感觉不舒服啊.写完赶紧去复习啊       在前两节中,我们介绍了Windows API 编程的一些基本概念和一个最基本API函数 MessageBox的使用,在这节中,我们就来正式编写一个Windows的窗口程序. 在具体编写代码之前,我们必须先要了解一下API 编写窗口程序具体的三个基本步骤:             1. 注册窗口类:             2.创建窗口:             3.显示窗口: 恩,

Python学习记录day6

Python学习记录day6 学习 python Python学习记录day6 1.反射 2.常用模块 2.1 sys 2.2 os 2.3 hashlib 2.3 re 1.反射 反射:利用字符串的形式去对象(默认)中操作(寻找)成员 cat commons.py #!/usr/bin/env python#_*_coding:utf-8_*_''' * Created on 2016/12/3 21:54. * @author: Chinge_Yang.''' def login(): pr

Python学习记录-2016-11-29

今日学习记录: 心灵鸡汤: 要有合适自己的目标,一个目标一个目标实现,切忌好高骛远: 最好的投资就是投资自己: 实现梦想 学习,学习,再学习: Talk is cheap. 从本身而言,余三十而立之年,从事测试行业7七年有余,一年半华为外包路由器,两年无线wifi测试,一年半网管软件测试,一年自动化测试经理,推行公司自动化测试进程,从开始的TCL,到现在的python,工欲善其事必先利其器,所以自己来学习,总体我认为我的目标是一直前进的,不断变化的,但是方向并没有大的错误,有些累,所以近期有些懈

程序的机械级表示学习记录

程序的机械级表示学习记录 X86的三代寻址方式 DOS时代的平坦模式,不区分用户空间和内核空间,很不安全. 8086的分段模式. IA32的带保护模式的平坦模式. 对于机械级编程的两种重要抽象 ISA:机械级程序的格式和行为,定义为指令集体系结构,它定义了处理器状态.指令的格式,以及每条指令对状态的影响. 虚拟地址:机器级程序使用的存储器地址,提供的存储器模型看上去是一个非常大的数组.存储器系统的实际实现是将多个硬件存储器和操作系统软件组合起来的. 在GCC中获得汇编代码与反汇编 获得汇编代码:

python 系统地学习记录

由头: python值得一学. 尝试一下写学习记录,看看效果. 1.记录一些不熟悉或者重要的知识点. 2.记录一些遇到的问题,标签 Question. 书:python基础教程(第2版) Chapter 1:基础知识 本章的内容熟悉即可. 比较重要的是字符串,单双引号转义,str,repr... Time 1.5 h  2015.8.31 23:09 版权声明:本文为博主原创文章,未经博主允许不得转载.

Java 静态内部类与非静态内部类 学习记录.

目的 为什么会有这篇文章呢,是因为我在学习各种框架的时候发现很多框架都用到了这些内部类的小技巧,虽然我平时写代码的时候基本不用,但是看别人代码的话至少要了解基本知识吧,另外到底内部类应该应用在哪些场合,我并不是很清楚,留下一些值得思考的问题作为记录,说不定以后能自己来填.于是就会有这篇文章啦. 常规使用方法我也不想介绍,网上一大把,我就说说比较容易错的,值得注意的地方. 注意 这篇文章只是分享一下我对内部类的一些研究与困惑吧,说不定对大家有帮助,说不定能引导大家一起思考学习.Java语法知识其实

struts2 学习记录 之 国际化

struts2 接下来是国际化,如果一个系统想要被多个国家的人所用就不得不考虑国际化的问题,如果为每一个国家都开发一套系统维护起来会很麻烦,所以就有了个思想,那就是把动态的,用不同语言展示的部分,放到配置文件中,动态的从文件里读取想要展示的内容,不同国家的人就得到了不同的展示,这是一个很好的思想,所以我把它记录一下了,嘻嘻... 首先 struts2 要把它的配置文件写好,以中文和美式英语为例,配置文件如下: 配置文件是以键值对的形式存在的,且以properties结尾,命名也有一定的格式,如t