您的位置:首页 > 编程语言 > C#

.Net学习笔记7-.Net基础2 常用类库

2017-12-30 00:20 519 查看
1.String类库
String成员方法:
1).Contains、StartsWith、EndsWith

bool Contains(String str):判断字符串对象是否包含给定的字符串。
bool StartsWith(String str):判断字符串对象是否以给定的字符串开始。
bool EndsWith(String str):判断字符串对象是否以给定的字符串结束。
string str = "Hello";
            Console.WriteLine(str.Contains("l"));//true
            Console.WriteLine(str.Contains("a"));//false
            Console.WriteLine(str.StartsWith("he"));//false
            Console.WriteLine(str.StartsWith("He"));//true
            Console.WriteLine(str.EndsWith("lo"));//true
            Console.WriteLine(str.EndsWith("Lo"));//false

2).Length、IndexOf、LastIndexOf、Substring

int Length:获取字符串的长度属性
char ch = s[3];
int IndexOf(char ch):返回指定字符在此字符串中第一次出现的索引
int IndexOf(String str):返回指定字符串在此字符串中第一次出现的索引
LastIndexOf:最后一次出现的位置。
String Substring(int start):截取字符串。返回从指定位置开始截取后的字符串。
String substring(int start,int length)截取字符串。返回从指定位置开始截取指定长度length的字符串。

string s1 = "hellooabcdaabe";
int i = s1.IndexOf('l');
Console.WriteLine(i);
Console.WriteLine(s1.IndexOf("ab"));
Console.WriteLine(s1.LastIndexOf('l'));

string s2 = s1.Substring(4);
Console.WriteLine(s2);
Console.WriteLine(s1.Substring(4,3));

案例获取一个文件名的名称和扩展名部分:
string filename = "[ADS-118]林志aaaaaa玲.avi";//
int dotIndex = filename.IndexOf('.');//3
string name = filename.Substring(0, dotIndex);
Console.WriteLine(name);
string ext = filename.Substring(dotIndex + 1);
Console.WriteLine(ext);

3)字符串对象内容是不可改变的
.ToLower()、ToUpper()、Replace()、trim()、Split()

String ToLower():把字符串变成小写;String ToUpper():把字符串变成大写
String Replace(char oldChar,char newChar):用新的字符去替换指定的旧字符;
String Replace(String oldStr,String newStr):用新的字符串去替换指定的旧字符串
String trim():去除字符串两端空格, Trim(params char[] trimChars)去掉两端的给定字符。 
TrimEnd:去掉结尾的空格  TrimStart:去掉开头的空格
String是不可变的,因此上面的操作都是生成新的字符串对象,要用返回值去取新的字符串。
字符串对象一旦声明对象内容,是不可改变的。字符串对象是只读的
String[] Split(...):重载方法很多,字符串按照分隔符切割成字符串数组。
案例:把字符串用“,”分割
string s2 = "a,b,c,|,1,2,1|1";
sstring[] s2_1 = s2.Split(',','|');
            string[] s2_2 = s2.Split(new char[] { ',', '|' },StringSplitOptions.RemoveEmptyEntries);
//StringSplitOptions.RemoveEmptyEntries:去除空字符串的数组元素
            for (int i = 0; i < s2_1.Length; i++)
            {
                Console.Write('['+s2_1[i]+"]   ");
            }
            Console.WriteLine();
            for (int i = 0; i < s2_2.Length; i++)
            {
                Console.Write('['+s2_2[i]+"]   ");
            }
输出结果:[a]     [c]   []    []   [1]   [2]   [1]   [1]
 [a]   [b]   [c]   [1]   [2]   [1]   [1]

 
[b]4)String的静态方法  直接通过类来调用


判断字符串是否为null或者是空字符串:
     String.IsNullOrEmpty(string value)
不区分大小写比较。案例:验证码
     String.Equals(string a, string b, StringComparison. OrdinalIgnoreCase)
把一个数组(集合)用分隔符separator连接为一个字符串。
1233c

String.Join(string separator, params string[] value)

string s1 = null;//s1未指向任何字符串对象
string s2 = "";//s2指向长度为0的空字符串对象  空字符串
string s3=" ";//s3指向长度为1的空字符串对象
-------
string s1 = null;//s1未指向任何字符串对象
            string s2 = "";//s2指向长度为0的字符串对象  空字符串
            Console.WriteLine(string.IsNullOrEmpty(s1));//true
            string s3 = "aab";
            string s4 = "Aab";
            Console.WriteLine(string.Equals(s3,s4));//判断字符串是否完全一样 false
            Console.WriteLine(string.Equals(s3,s4,StringComparison.OrdinalIgnoreCase));//true 不区分大小写
            int[] nums = { 1, 2, 3, 4, 5 };
            string num = string.Join(",", nums);
            Console.WriteLine(num);//1,2,3,4,5

5)StringBuilder

1、使用反编译发现

String s7="111"+"222"+"333"+"444"+"555"  

会被优化为  String s7 = "111222333444555";

但是String s6 = s1 + s2 + s3 + s4 + s5;就没那么幸运了,每次+都会生成一个String对象,

当连接字符串比较多的时候就会产生临时字符串对象。

2、使用StringBuilder拼接字符串则不会有临时字符串对象的问题:

StringBuilder sb = new StringBuilder();

sb.Append(s1);

sb.Append(s2);

sb.Append(s3);

因为Append方法把this返回了,还可以sb.Append(s1).Append(s2).Append(s3);
最后使用String s = sb.ToString()一次性生成拼接结果字符串即可
class Program
{

static void Main(string[] args)

{

/*

string s1 = "aaa" +

+"aaaaa"+"bbb";

Console.WriteLine(s1);

*/

string s1 = "aaa";

string s2 = "bbb";

string s3 = "ccc";

string s4 = "ddd";

string s5 = "afadsf";

string s6 = s1 + s2 + s3 + s4 + s5;

StringBuilder sb = new StringBuilder();

/*

sb.Append(s1);

sb.Append(s2);

sb.Append(s3);

sb.Append(s4);

sb.Append(s5);

sb.Append(33);*/

  sb.Append(s1).Append(s2).Append(s3).Append(s4).Append(s5);

  sb.AppendLine("hello");

  sb.AppendLine("afasdfads");

string s7 = sb.ToString();

Console.WriteLine(s7);

Person p1 = new Person();

p1.Eat().Sleep().Dota();//链式编程 Jquery

Console.ReadKey();

}

}
class Person
{

public Person Eat()

{

Console.WriteLine("吃饭");

return this;

}

public Person Sleep()

{

Console.WriteLine("睡觉");

return this;

}

public Person Dota()

{

Console.WriteLine("打Dota");

return this;

}

}

6)可空int(值类型)

int等是值类型,不能为null。有时想表达“不知道数字是多少”的时候,用int任何值表示都不合适。
C#中可以用“int?”表示“可空的int”。注意类型转换:
int? i1=5;
if(i1!=null)
{

int i= (int)i1;

}
也可以通过i1.HasValue判断是否为null、i1.Value来获得值。
int? i = null;
int? i2 = 3;
if (i == null)
{

Console.WriteLine("i为null");

}
if (i2 != null)//i2.HasValue
{

//i2++;

i2 = i2 + 3;

//int i3 = i2;//把可能为null的int?赋值给一定不为null的int

int i3 = (int)i2;//i2.Value

Console.WriteLine(i2);

}
long? l = null;

练习:把阿拉伯数字转换为中文金额数字:123→壹佰贰拾三圆
static void ZHuan(int num)

        {

            string[] nums = { "零", "壹", "贰", "叁", "肆", "伍", "陆", "柒", "捌", "玖" };

            string[] wei = { "", "", "拾", "佰", "仟", "萬", "拾", "佰", "仟", "亿", "拾", "佰", "仟", };

            if (num < 0)

            {

                throw new Exception("num不能为负数!");

            }

            string num1 = Convert.ToString(num);

            int len = num1.Length;

            string tmps, sb;

            sb = "";

            int i;

            for ( i= 1; i <= len; i++)

            {

                tmps = num1.Substring(len - i, 1);

                //sb = nums[Int32.Parse(tmps)] + wei[i] + sb;

                sb= string.Concat(nums[Int32.Parse(tmps)] + wei[i], sb);

            }

            sb= sb.Replace("零拾", "零").Replace("零佰", "零").Replace("零仟", "零");

            for (i = 1; i <= 6; i++)

            {

                sb = sb.Replace("零零", "零");

            }

            sb=sb.Replace("零萬", "萬").Replace("零億", "億").Replace("零零", "零");

            sb += "圆整";

            sb = sb.Replace("零圆", "圆");

            Console.WriteLine(sb);

        }

2.异常(Exception)
*异常发生在程序发生的不正常情况下。异常以一个异常类对象的形式抛出,异常类描述异常信息、发生的位置等。
*异常的根类为Exception。异常类一般都继承自Exception
*自定义异常类

class MyException:Exception
{

public MyException(string msg) : base(msg) { }

}
throw new MyException("自定义异常信息");

*抛出异常:
“System.NullReferenceException”类型的未经处理的异常在 ExceptionTest.exe 中发生 
      其他信息: 未将对象引用设置到对象的实例。
*异常捕获:

try
{

Console.WriteLine("ToString()开始");

String s = null;//s1没有指向任何对象

s.ToString();//调用s所指向的对象的ToString方法

//一旦try代码块中发生异常,则代码块中异常点之后的代码就不会执行了

Console.WriteLine("ToString()结束");

}
catch (NullReferenceException ex)
{

//把可能发生异常的代码放到try代码块中

//catch捕获代码段中的NullRefernenceException异常

//如果捕捉到了,e就代表异常对象

Console.WriteLine("为空"+ex.Message);



*e就是发生异常的异常类对象,变量名只要不冲突就任意。
*在异常处理中,一旦try里面有问题了。放弃try代码块中之后的代码,直接跳到catch里面执行。如果try代码后还有代码,则处理完catch后还会继续执行。

*多个异常的处理

try
{

int a = 10;

int b = 0;

Console.WriteLine(a / b);

int[] arr = { 1, 2, 3 };

Console.WriteLine(arr[3]);

}
catch (DivideByZeroException ae)
{

Console.WriteLine("除数不能为0");

}
catch (IndexOutOfRangeException ae)
{

Console.WriteLine("数组越界异常");

}

可以catch住父类异常,这样就可以抓住所有子类异常了,但是强烈不建议大家这样做,特别是不要没理由的catch(Exception ex)
 好的异常处理习惯:

不要只是把异常catch住什么都不做或者只是打印一下,这不是正常的“异常处理”。
不知道怎么处理就不要catch,出错比“把错误藏起爱”好。这样以为“不会出错了”,其实是把异常“吃掉了”,会让程序陷入逻辑混乱状态,
要科学合理的处理异常(以后经常用就明白了)。

try
{

//有可能有问题代码

}
catch(异常类型 异常变量)
{

//处理方式

}
finally
{

//无论“有可能有问题代码”是否出错都要执行的代码

}

*finally中一般进行资源的回收等
*注意:在vs调试的情况下,finally的执行可能看不到,因为vs会把异常抛出阻断代码执行,如果想验证是否都会进入finall,可以按CTRL+F5执行程序。
*可以try{}catch(){},try{}catch(){}finally{},try{}finally{}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  .net c#