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
buffer 为 null。
试图访问套接字时发生错误。有关更多信息,请参见备注部分。
Socket 已关闭。
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
buffer 为 null。
试图访问套接字时发生错误。有关更多信息,请参见备注部分。
Socket 已关闭。
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两种方法。
C#学习记录的更多相关文章
- Quartz 学习记录1
原因 公司有一些批量定时任务可能需要在夜间执行,用的是quartz和spring batch两个框架.quartz是个定时任务框架,spring batch是个批处理框架. 虽然我自己的小玩意儿平时不 ...
- Java 静态内部类与非静态内部类 学习记录.
目的 为什么会有这篇文章呢,是因为我在学习各种框架的时候发现很多框架都用到了这些内部类的小技巧,虽然我平时写代码的时候基本不用,但是看别人代码的话至少要了解基本知识吧,另外到底内部类应该应用在哪些场合 ...
- Apache Shiro 学习记录4
今天看了教程的第三章...是关于授权的......和以前一样.....自己也研究了下....我觉得看那篇教程怎么说呢.....总体上是为数不多的精品教程了吧....但是有些地方确实是讲的太少了.... ...
- UWP学习记录12-应用到应用的通信
UWP学习记录12-应用到应用的通信 1.应用间通信 “共享”合约是用户可以在应用之间快速交换数据的一种方式. 例如,用户可能希望使用社交网络应用与其好友共享网页,或者将链接保存在笔记应用中以供日后参 ...
- UWP学习记录11-设计和UI
UWP学习记录11-设计和UI 1.输入和设备 通用 Windows 平台 (UWP) 中的用户交互组合了输入和输出源(例如鼠标.键盘.笔.触摸.触摸板.语音.Cortana.控制器.手势.注视等)以 ...
- UWP学习记录10-设计和UI之控件和模式7
UWP学习记录10-设计和UI之控件和模式7 1.导航控件 Hub,中心控件,利用它你可以将应用内容整理到不同但又相关的区域或类别中. 中心的各个区域可按首选顺序遍历,并且可用作更具体体验的起始点. ...
- UWP学习记录9-设计和UI之控件和模式6
UWP学习记录9-设计和UI之控件和模式6 1.图形和墨迹 InkCanvas是接收和显示墨迹笔划的控件,是新增的比较复杂的控件,这里先不深入. 而形状(Shape)则是可以显示的各种保留模式图形对象 ...
- UWP学习记录8-设计和UI之控件和模式5
UWP学习记录8-设计和UI之控件和模式5 1.日历.日期和时间控件 日期和时间控件提供了标准的本地化方法,可供用户在应用中查看并设置日期和时间值. 有四个日期和时间控件可供选择,选择的依据如下: 日 ...
- UWP学习记录7-设计和UI之控件和模式4
UWP学习记录7-设计和UI之控件和模式4 1.翻转视图 使用翻转视图浏览集合中的图像或其他项目(例如相册中的照片或产品详细信息页中的项目),一次显示一个项目. 对于触摸设备,轻扫某个项将在整个集合中 ...
- UWP学习记录6-设计和UI之控件和模式3
UWP学习记录6-设计和UI之控件和模式3 1.按钮 按钮,响应用户输入和引发 Click 事件的控件. 使用<Button>就能创建一个按钮控件了.按钮是 ContentControl, ...
随机推荐
- Windows Azure 服务总线和物联网
机器到机器 (M2M) 计算正迅速成为一种技术,所有开发人员和架构师需要拥抱. 许多研究表明一个未来世界的数百亿美元的设备 (在地球上的每一个人的出现).MSDN杂志有2篇文章讨论Azure服务总线和 ...
- ABP理论学习之通知系统
返回总目录 本篇目录 介绍 订阅通知 发布通知 用户通知管理者 实时通知 通知存储 通知定义 介绍 通知(Notification)用于告知用户系统中的特定事件.ABP提供了基于实时通知基础设施的发布 ...
- 剑指Offer面试题:8.斐波那契数列
一.题目:斐波那契数列 题目:写一个函数,输入n,求斐波那契(Fibonacci)数列的第n项.斐波那契数列的定义如下: 二.效率很低的解法 很多C/C++/C#/Java语言教科书在讲述递归函数的时 ...
- 【读书笔记】Asp.Net MVC 上传图片到数据库(会的绕行)
之前上传图片的做法都是上传到服务器上的文件夹中,再将url保存到数据库.其实在MVC中将图片上传到数据库很便捷的事情,而且不用去存url了.而且这种方式支持ie6(ie6不支持jquery自动提交fo ...
- 《CLR.via.C#第三版》第二部分第10,11章节读书笔记(五)
第10章是对 属性 做阐述 属性本质上是方法 匿名类型的使用: }; Console.WriteLine("Name={0},Year={1}",o1.Name,o1.Year); ...
- 实战JS正则表达式
-正则表达式是一种文本模式的匹配工具. -文章导读: --1.正则对象的属性和方法 --2.字符串对象的方法 --3.使用正则表达式: ---3.1 给字符串加上千分符 ---3.2 字符串中出现次数 ...
- 常用网络工具 ipconfig arp traceroute
如今的计算机是离不开网络的计算机了,因而我们对网络要有一基础的认识.连不上网,程序运行不正常之类的,多少都与网络有关.本文将介绍常用的工具. 网络出问题 ipconfig ping 网络连不上,首先要 ...
- ie a absolute bug
给a设置position:absolute时,在IE下,尽管display:block;width:100%;height:100%,依然无法点击.但是加一个背景颜色就可以了.如果不需要背景,再把背景 ...
- Tomcat 让百度的域名显示自己的页面内容(玩耍篇)
步骤一:在 C:\Windows\System32\drivers\etc目录下的Hosts文件中添多一个条目,如下图, 第二步:在server.xml文件中做响应配置,如下图 然后在Host节点中进 ...
- Discuz门户首页关键词和描述显示“首页”的解决方法
Discuz社区在后台设置好门户标题.关键字.描述,更新缓存,发现用户登录状态下,门户首页的关键字和描述正常显示:但在游客状态下不显示,在某工具中查看到的情况如下: 现找到两种解决办法:(记得修改前备 ...