----------------------
ASP.Net+Android+IO开发S、
.Net培训、期待与您交流! ----------------------
函数重载overload:
ref应用场景内部对外部的值进行改变,out则是内部为外部变量赋值,out一般用在函数有多个返回值的场所,让函数有多个返回值,充当一个返回值的效果。
out 也是 所有路径都要有返回值,不能存在没有返回值的情况
再根据char[]生成新的字符串,但是原先的字符串没有改变(他就在那里)
案例:截取字符串前5个
----------------------
ASP.Net+Android+IO开发S、
.Net培训、期待与您交流! ----------------------
1. 函数
目的是代码重用
命名规则:函数名开头大写,参数名开头小写,参数名、变量名要有意义
返回值:
1) 函数如果没有返回值则标记返回值类型为void
2) return语句:导致函数立即返回。在返回值为void的函数中return,在返回值非void的函数中return数值
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"。
返回给我一个字符串,然后字符串使用我指定的分隔符来进行分割,比如我指定用"|"分割,那么返回给我"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)//可变参数数组必须是最后一个
构成重载的条件:同名的两个函数的签名(参数的类型、顺序,返回值的类型)不能完全一致;
和参数的名字无关;
函数的重载不关返回值类型;
函数的重载不关返回值类型;
只有参数的类型、顺序.个数不一致才能函数重名,函数返回值类型一致与否没关系
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数组的修改也不会造成字符串的变化
对数组进行修改后,调用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);
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地址错误的情况(必须含有@,并且@不能在最开始、最后出现),如果错误告诉用户。
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
//{
//}