基础笔记 一 基本概念
Posted 海龟123
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了基础笔记 一 基本概念相关的知识,希望对你有一定的参考价值。
. 程序集和命名空间的概念
(1)bin文件引用的是程序集,using 引用的是命名空间
(2)一个程序集中包含很多命名空间(一个命名空间也可以包含很多程序集,但通常不这么用),命名空间的名字通常是程序集的名字或者 程序集.文件夹,如下图:
我们说的程序集其实就是类库
2. 常使用的快捷键
ctrl+M ,ctrl+O 收缩代码,只对后台代码有效
ctrl+k+d ,对齐代码
f12 ,代码定位
f1,在线的MSDN帮助
prop 按两下tab,快速打属性字段
3. 调试窗口:运行时才有效
(1),即时窗口
(2),添加监视
(3)快捷键F12可快速跳转到定义,Ctrl 加 - (减号)可跳转回原来的位置。
4. 类型转换
(1)值类型之间的转换
隐式转换:小类型转成大类型,是隐式转换: 比如 int 转成 float ,int类型四个字节,float 类型8字节
显式转换:大类型转换为小类型,强制转换,比如 float a=13.5 ,int b; b=(int)a; // 13
(2)字符串与值类型转换:
int a=10 ; string b=a.toString();
string c=“12.4”; int a=float.parse(c);
ps: a+c 会自动转换为字符串
(3) 万能转换器进行不同类型的转换: Convert.ToXXX(Object value)
double a=Convert.ToDouble("20.15");
DateTime dateTime=Convert.ToDateTime("2012-03-15");
int c=Convert.ToInt32(a); // 20 ,注意转换成整数时,采用四舍五入
PS:拆箱装箱:将值类型转换成 object ,叫装箱
装箱:CLR需要做额外的工作,把堆栈上的值类型移动到堆上
拆箱:装箱操作的反操作,把堆上的数据移动到堆栈上,并返回其值
所以装箱拆箱的操作意味着一系列的堆栈操作,无疑是性能的消耗,我们应该避免装箱,拆箱的操作
var i = 123; //System.Int32 //对 i 装箱(隐式) object obj = i; //对 obj 进行拆箱(显式) i = (int)obj;
// 使用泛型,避免使用object类型
ArrayList arraylist=new ArrayList();
arrayList.add(0);
arrayList.add("1");
List<int> list=new List<int>();
list.add(0);
list.add(1);
ps:类型转换,为了避免抛出异常,可以使用is 和as 进行转换,is 只是返回true 和false,as 如何转换失败,会使用null
(4)浮点类型
float在转成double的时候出现了精度的丢失问题,所以尽量不要使用float ,而使用double
double a = 0.3; double b; b = a * 1.345; // 结果 0.4035
float a=0.3F;
double b;
b = a * 1.345; // 结果 0.403500016033649
(5) 值类型是存储在堆栈上的,常用的值类型是 整数型,浮点型,布尔型,struct,枚举类型
(6) decimal (金额)
decimal myMoney = 99.9m; 必须要加m,否则发生编译 double x = (double)myMoney; myMoney = (decimal)x;
decimal拥有比float更高的精度,最高能处理到小数点后面的28位。适合用在财务类等对数字精确度要求比较高的场合。
5. 逻辑运算符
&& : a && b ,逻辑与 ,a和b都为true 结果为true ,注意如果a 为false ,b就不会运算
||: a || b ,逻辑或,如果a为true ,b就不会在运算
应用 : var a= app || {}
!:逻辑非
6. 条件运算符if ..else 和 switch
if...else 用于区间判断,else 与离他最近的if是一对
switch 等值判断
7. 循环
平面的输出(二维输出),是两个 for循环,外层控制行,内层控制列
======================字符串和数组========================
8. String 类型常用的方法
(1) indexOf (): 查找索引 ,string a=“qwert”; a.indexOf("w"); //1
(2)length :求字符串的长度
(3)字符串比较: == 或者 Equals(),两则没有区别,但是后者显得更加专业些
(4)字符串截取: SubString(int startIndex,int length)
string email=“xiaowang@qq.com”;
string name=email.SubString(0,email.IndexOf("@"));
(5) 使用占位符完成字符串的拼接,占位符格式可以是货币,小数点位数等
string newstr=string.Format("我的名字{0},我的年龄是{1},我有{2:C3}",name,20,2000) // Y2000.000
(6)Trim(),ToUpper,ToLower(),LastIndexOf()
(7)StringBuilder 类,定义可变字符串:如果字符串频繁的操作,使用它效率高
(8) string StuName=string.Empty;
9 .数组的常用方法
(1),C#数组声明的时候要指定长度
(2),数组在计算机内存中存储是连续的一块内存,变量定义的是首地址,使用下标来访问数据
(3),int[] a=new int[5]; int b={1,2,3,4,5,6}; int b=new int[]{1,2,3,4,5,6}
(4) ,字符串补充: string.join("_",nameArray); "qr,qr,t,wt,y".split(\',\');
(5) 数组的遍历: for 或者 foreach(int key in Array)
ps: struct 不常用,作了解即可
enum: Icon = (Icon)Enum.Parse(typeof(Icon), dt.Rows[i]["F_Icon"].ToString());
11 .运算
2^10=1024 =1K 1024K=1M 1024M=1G 1G=2^10*2^10*2^10=2^30
12. 托管堆和非托管堆
托管堆,CG会自动回收,而非托管堆,CG不会自动回收,需要手动调用Dispose()方法释放内存
非托管的堆有:文件流,数据库连接等
13. String 和 Byte[] 对象之间如何转换
bit: 表示一个二进位(数据库中表示布尔类型)
Byte:字节 1Byte=8bit
编码:数字信息和现实信息转换机制,一种编码通常定义了一种字符集和转换原则,常用的编码是 utf-8 ,gb2312,unicode
字节数组和字符串的转换必然涉及到某种编码方式,不同的编码方式会产生不同的转换结果,在C#中,可以使用 System.Text.Encoding来管理常用的编码
class Program { static void Main(string[] args) { string s = "我是字符串,I am a string!"; // 字节数组 -> 字符串 Byte[] utf8 = StringToByte(s, Encoding.UTF8); Byte[] gb2312 = StringToByte(s, Encoding.GetEncoding("GB2312")); Byte[] unicode = StringToByte(s, Encoding.Unicode); Console.WriteLine(utf8.Length); Console.WriteLine(gb2312.Length); Console.WriteLine(unicode.Length); // 字符串 -> 字符数组 Console.WriteLine(ByteToString(utf8, Encoding.UTF8)); Console.WriteLine(ByteToString(gb2312, Encoding.GetEncoding("GB2312"))); Console.WriteLine(ByteToString(unicode, Encoding.Unicode)); Console.ReadKey(); } // 字符串 -> 字节数组 static Byte[] StringToByte(string str, Encoding encoding) { if (string.IsNullOrEmpty(str)) { return null; } return encoding.GetBytes(str); } // 字节数组 -> 字符串 static string ByteToString(Byte[] bytes, Encoding encoding) { if (bytes == null || bytes.Length <= 0) { return string.Empty; } return encoding.GetString(bytes); } }
上述代码的运行结果如下图所示:
我们也可以从上图中看出,不同的编码方式产生的字节数组的长度各不相同。
13.BASE64 编码的作用,以及在C#中对其支持
和传统的编码不同,BASE64编码的设计致力于混肴那些8位字节的数据流(解决网络传输中明码问题),在网络传输,邮件系统中被广泛应用,BASE64不属于加密,但是它却能把明码变成很难识别的一种形式。
在.NET中,BASE64编码的应用也很多,例如在ASP.NET WebForm中,默认为我们生成了一个ViewState来保持状态,如下图所示:
这里的ViewState其实就是服务器在返回给浏览器前进行了一次BASE64编码,我们可以通过一些解码工具进行反BASE64编码查看其中的奥秘:
那么,问题来了?在.NET中开发中,怎样来进行BASE64的编码和解码呢,.NET基类库中提供了一个Convert类,其中有两个静态方法提供了BASE64的编码和解码,但要注意的是:Convert类型在转换失败时会直接抛出异常,我们需要在开发中注意对潜在异常的处理(比如使用is或as来进行高效的类型转换)。下面的代码展示了其用法:
class Program { static void Main(string[] args) { string test = "abcde "; // 生成UTF8字节数组 byte[] bytes = Encoding.UTF8.GetBytes(test); // 转换成Base64字符串 string base64 = BytesToBase64(bytes); Console.WriteLine(base64); // 转换回UTF8字节数组 bytes = Base64ToBytes(base64); Console.WriteLine(Encoding.UTF8.GetString(bytes)); Console.ReadKey(); } // Bytes to Base64 static string BytesToBase64(byte[] bytes) { try { return Convert.ToBase64String(bytes); } catch { return null; } } // Base64 to Bytes static Byte[] Base64ToBytes(string base64) { try { return Convert.FromBase64String(base64); } catch { return null; } } }
上面代码的执行结果如下图所示:
ps: 字符串转换成BASE64,先把字符串转换成字节,然后再把字节转换为BASE64 字符串
以上是关于基础笔记 一 基本概念的主要内容,如果未能解决你的问题,请参考以下文章