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

---------------------- 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培训、期待与您交流! ----------------------
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值