黑马程序员—C#系列 (二)

来源:互联网 发布:在虚拟机上配置nginx 编辑:程序博客网 时间:2024/05/16 14:57
---------------------- ASP.Net+Android+IO开发S、.Net培训、期待与您交流! ----------------------

1. 函数

目的是代码重用

命名规则:函数名开头大写,参数名开头小写,参数名、变量名要有意义

返回值
1) 函数如果没有返回值则标记返回值类型为void
2) return语句:导致函数立即返回。在返回值为void的函数中return,在返回值非void的函数中return数值
3) 函数答应返回int就必须返回int, 不能不返回,不能返回其他类型//所有路径都要有返回值,不能存在没有返回值的情况

练习  :提供一个函数,将用户提供的一个字符串重复n遍形成一个新的字符串
static string Repeat重复(string s,int n){   string t = "";    for(int i = 0;i < n;i++)   {     t = t + s   }    return t;}
练习:string[] strs={"aa","333","ccc"};
返回给我一个字符串,然后字符串使用我指定的分隔符来进行分割,比如我指定用"|"分割,那么返回给我"aa|333|ccc"。

string[] strs = {"cc","bb","aa"};        static string Fenge(string[] strs,string s)        {            string newstrs = "";            for (int i = 0; i < strs.Length - 1; i++)            {                newstrs += strs[i] + s;            }            newstrs += strs[strs.Length - 1];            return newstrs;        }

参数:
1) 确定函数参数的原则:自己能确定的数据自己内部解决,自己确定不了的数据通过参数传递
2) 参数默认值(C#4.0 vs2010) :
void SayHello(string name,int age=20)(*了解)  int age = 20;  //age可传可不传 ,不传的话age就是20
3) 默认值参数也必须放到非默认值之后,可以有多个
4) 函数参数默认是值传递的,也就是“复制一份”,传进来的的时候是复制了一份传进来,折腾的是复制品,不影响原来的值,外边的不会变
5) 参数数组:
int sum(params int[] values)int sum(string name,params int[] values)//可变参数数组必须是最后一个

函数重载overload
构成重载的条件:同名的两个函数的签名(参数的类型、顺序,返回值的类型)不能完全一致;
和参数的名字无关;
函数的重载不关返回值类型;
只有参数的类型、顺序.个数不一致才能函数重名,函数返回值类型一致与否没关系
SayHello("XXX");SayHello("AK",47);      static void SayHello(string name,int age)        {            Console.WriteLine("我是{0},我{1}岁",name,age);        }        static void SayHello(string name)        {            //用重载来实现参数默认值的效果,在构造函数中用的特别多            SayHello(name, 20);        }

2.ref和out

ref (reference)  用ref之前必须给变量赋值
int i1 = 10;int i2 = 20;        Swap(ref i1, ref i2);//传递引用。给ref传递参数的时候也要加上ref        Console.WriteLine("i1={0},i2={1}",i1,i2);//结果为int i1=20 int i2=10        static void Swap(ref int i1, ref int i2)//reference→ref        {            //标记为ref就是要求调用者传递变量的引用            int temp = i1;            i1 = i2;            i2 = temp;        }
ref必须先初始化,因为是引用,所以必须先“有”,才能引用,而out则是内部为外部赋值,所以不需要初始化,而且外部初始化也没用。
ref应用场景内部对外部的值进行改变,out则是内部为外部变量赋值,out一般用在函数有多个返回值的场所,让函数有多个返回值,充当一个返回值的效果。
out 也是 所有路径都要有返回值,不能存在没有返回值的情况

     //bool b= false;//不需要为out赋初值,赋了也白搭            bool b;            int i = Parse(Console.ReadLine(), out b);            if (b)            {                Console.WriteLine("成功,i={0}", i);            }            else            {                Console.WriteLine("错误");            }            Console.ReadKey();        static int Parse(string s,out bool success)        {            //Console.WriteLine(success);            if(s=="一")            {                success = true;                return 1;            }            else if(s=="二")            {                success = true;                return 2;            }            else            {                success = false;                return -1;            }        }
案例:int.TryParse
string s = Console.ReadLine();            int i;            if (int.TryParse(s, out i))            {                Console.WriteLine("成功:" + i);            }            else            {                Console.WriteLine("输入错误");            }            Console.ReadKey();

3.字符串

string s="abc";//是声明一个变量s,把s指向"abc"这个字符串。
字符串的不可变性

C#中字符串有一个重要的特性:不可变性,字符串一旦声明就不再可以改变。所以只能通过索引来读取指定位置的char,不能对指定位置的char进行修改
如果要对char进行修改,那么就必须创建一个新的字符串,用s. ToCharArray()方法得到字符串的char数组,
对数组进行修改后,调用new string(char[])这个构造函数(暂时不用细研究)来创建char数组的字符串。
一旦字符串被创建,那么char数组的修改也不会造成字符串的变化
例子:
string s = "afdasfddsafasdfads";            char[] chars =  s.ToCharArray();            chars[2] = 'w';            //string s1 = new string(chars);            s = new string(chars);            //Console.WriteLine(s1);            Console.WriteLine(s);            Console.ReadKey();
字符串是不可变的,所以要先生成一个char[],再对char[]进行修改
再根据char[]生成新的字符串,但是原先的字符串没有改变(他就在那里)

常用的字符串函数
s.ToLower(); //把字符串转换为小写  s.ToUpper();//把字符串转换为大写  s.Trim();  //去掉字符串两端的空格,不会去掉中间的s.Equals(s2, StringComparison.OrdinalIgnoreCase);          //Ingnore:忽略Case:大小写(CaseSensitive:大小写敏感) string.Format("我叫{0},我{1}岁","yzk",100);//用占位符、格式生成新的字符串 String.IsNullOrEmpty()string s1 = string.Join("|", values);//第一个参数是string类型分隔符
string[] Split(params char[] separator)//将字符串按照指定的分割符分割为字符串数组string[] Split(char[] separator, StringSplitOptions options)//将字符串按照指定的char分割符分割为字符串数组( options 取RemoveEmptyEntries的时候移除结果中的空白字符串)string[] Split(string[] separator, StringSplitOptions options)//将字符串按照指定的string分割符分割为字符串数组
例子:
           string line = Console.ReadLine();//1,3,5,6,6            string[] strs = line.Split(',','|');//因为分隔结果可能是多个,所以是string数组            foreach (string str in strs)            {                Console.WriteLine(str);            }
string[] lines = System.IO.File.ReadAllLines(@"c:\root.ini", Encoding.Default);//从文本文件读取数据,返回值为string数组,每个元素是一行
字符串替换:
string Replace(string oldValue, string newValue)//将字符串中的出现oldValue的地方替换为newValue
取子字符串:
string Substring(int startIndex)//取从位置startIndex开始一直到最后的子字符串;string Substring(int startIndex, int length)//取从位置startIndex开始长度为length的子字符串,如果子字符串的长度不足length则报错。
案例:取s.Length-2,5中的最小值
            string s = "abc12f";            //string s1 = s.Substring(2, s.Length - 2>5?5:s.Length - 2);            //Math.Min返回两个参数中的最小值            string s1 = s.Substring(2, Math.Min(s.Length - 2,5));            Console.WriteLine(s1);
案例:截取字符串前5个
string s2 = s1.Substring(0, Math.Min(s1.Length, 5));//取字符串的长度和5中的最小值来截取,谁小取谁
bool Contains(string value)//判断字符串中是否含有子串value            string s = "伟大的共产党召开大会";            if (s.Contains("共产党"))//判断字符串中是否含有子字符串            {                Console.WriteLine("禁止发表");            }            else            {                Console.WriteLine("可以发表");            }   bool StartsWith(string value)//判断字符串是否以子串value开始;            string s = "ATM我是你们的忠实听众";            if (s.StartsWith("ATM"))//是否以某个字符串开头            {                Console.WriteLine("短信正确");            }            else            {                Console.WriteLine("短信错误");            }bool EndsWith (string value)//判断字符串是否以子串value结束;   int IndexOf(string value)//取子串value第一次出现的位置。            string s = "我北爱北京敏感词";            int i = s.IndexOf("北京");            //int i = s.IndexOf("南京");            //子字符串在字符串中第一次出现的位置(以第一个字符为序号)            //如果不存在则返回-1            //Console.WriteLine(i);
案例:
从Email中提取出用户名和域名:abc@163.com。
IndexOf找到@的位置。SubString。
要考虑Email地址错误的情况(必须含有@,并且@不能在最开始、最后出现),如果错误告诉用户。

            string email = Console.ReadLine();            if (!email.Contains("@") || email.StartsWith("@") || email.EndsWith("@"))            {                Console.WriteLine("Email地址不正确");                return;            }            int atIndex = email.IndexOf("@");            string username = email.Substring(0, atIndex);            string domain = email.Substring(atIndex + 1);            Console.WriteLine("用户名:{0},域名:{1}",username,domain);            //if (错误)            //{            //}            //else            //{            //}
---------------------- ASP.Net+Android+IO开发S、.Net培训、期待与您交流! ----------------------