30天C#基础巩固------了解委托,string练习
---->了解委托。
生活中的例子:我要打官司,我需要找一个律师,法庭上面律师为当事人辩护,它真正执行的是当事人的陈词,这时律师 就相当于一个委托对象。当事人则委托律师为自己辩解。
C#中的委托是一个类,(类类型),因为只有类才有对象的概念。C#中的委托可以理解为函数的一个包装,它使得C#中的函数可以作为参数来传递。
委托的定义:
//定义委托
public delegate void MyDelegate(int para1,string para2);
委托的一些步奏:
1:定义委托类型,(方法类似于方法的申明)
public delegate void MyDelegate(int para1,int para2);
2:申明委托,既然委托是一种类型,可以利用委托来声明一个委托变量。
MyDelegate d;
3:实例化委托,并且 传递参数(方法)进去。
d=new MyDelegate(new Program().Add);
4:委托类型作为参数传递给另一个方法。
MyMethod(d);
5:在方法中调用委托。
private static void MyMethod(MyDelegate myDelegate)
{
//5:在方法中调用委托
myDelegate(1,2);
}
委托的注意事项:
1:定义委托只能使用delegate关键字,实例化委托是用一个方法名(不带括号)作为参数,并且这个方法的定义符合委托的定义,也就是该方法的返回值类型 ,参数个数,类型必须和委托定义中的一样。
2:委托可以把一个方法作为另一个方法的参数,可以看作是一个包装方法的对象。它的调用和方法的调用一样,传递参数类型和个数必须与委托定义一致。
委托我现在的理解就是把方法当作参数进行传递。下面的图片最后面的方法里面的求和就是调用前面Add()方法来进行。
/// <summary>
/// 委托的学习
/// </summary>
class Program
{
//1:使用delegate来定义委托
public delegate void MyDelegate(int para1,int para2);
static void Main(string[] args)
{
//2:申明委托
MyDelegate d;
//3:实例化委托,传递一个方法(实例化之后的方法),
d=new MyDelegate(new Program().Add);
//4:委托类型作为参数传递给另一个方法。
MyMethod(d); //d这里就相当于方法Add一样,我们传递到了MyMethod()方法中。
}
//这个方法定义必须和委托定义相同,即返回类型为void,两个参数为int.
private void Add(int para1,int para2)
{
int sum = para1 + para2;
Console.WriteLine("两个数的和为:"+sum);
Console.ReadKey();
}
//方法的参数是委托类型。
private static void MyMethod(MyDelegate myDelegate)
{
//5:在方法中调用委托
myDelegate(1,2);
}
}
委托的练习:
实现一个打招呼的方法,但是每个国家的是不一样的,我们需要使用委托来实现。
/// <summary>
/// 委托实例
/// </summary>
class Program
{
public delegate void GreetingDelegate(string name); //定义委托,一个参数。
static void Main(string[] args)
{
//引入委托
//这里总感觉不是声明实例化委托,只像是实例化了一个Program,注意这里实例化Program的同时,其实也就是把GreetingDelegate实例化了。
Program p=new Program();
p.Greeting("阿辉",p.ChineseGreeting); //委托的方法,这里的参数是我们的每个国家的方法。
p.Greeting("张辉",p.EnglishGreeting);
Console.ReadKey();
}
/// <summary>
/// 把委托作为参数,在方法里面调用传递的方法。
/// </summary>
/// <param name="name"></param>
/// <param name="callback"></param>
public void Greeting(string name,GreetingDelegate callback)
{
//调用委托
callback(name);
}
//英国人
public void EnglishGreeting(string name)
{
Console.WriteLine("Hello,"+name);
}
//中国人
public void ChineseGreeting(string name)
{
Console.WriteLine("你好,"+name);
}
}
注意我们这个练习和上面的区别,我们上面是直接按照步骤,每一步都没有省略,这里我们只是实例化了Program,我们上面的例子可以简写成这样。
static void Main(string[] args)
{
////2:申明委托
//MyDelegate d;
////3:实例化委托,传递一个方法(实例化之后的方法),
//d=new MyDelegate(new Program().Add);
////4:委托类型作为参数传递给另一个方法。
//MyMethod(d); //d这里就相当于方法Add一样,我们传递到了MyMethod()方法中。 Program d=new Program();
MyMethod(d.Add);
}
关于字符串等的练习。
eg--01: 123-456--7--89-----123-----2,把类似的字符串中重复符号-去掉。返回123-456-7-89-123-2的形式。
string str = "123-456--7--89-----123-----2";
string[] stsr = str.Split("-".ToCharArray(),StringSplitOptions.RemoveEmptyEntries); //先将字符串划分为字符数组,把其中的"-"去掉
str=string.Join("-",stsr); //利用Join把字符数组中的每一项通过"-"连接起来。
Console.WriteLine(str);
Console.ReadKey();
eg—02:从文件路径中提取出文件名(包括后缀),比如:C:/A/B.txt中提取出B.txt这个文件名。
string str = "C:/A/B.txt"; //我们通过File得到的路径都是字符串。
string path = Path.GetFileName(str);
Console.WriteLine(path);
Console.ReadKey();
eg—03: "192.168.10.5[Port=21,type=ftp]",请用程序解析此字符串,打印"IP地址为,,,端口为,,,提供服务。。。"
方法1:
string str = "192.168.10.5[Port=21,type=ftp]";
int a = str.IndexOf('='); //获取到字节'='的地址
string port = str.Substring(++a, 2);//截取后面的数据
int b = str.IndexOf('[');
string ip = str.Substring(0, b);
int c = str.IndexOf('e');
string type = str.Substring(c + 2, 3);
Console.WriteLine(ip);
Console.WriteLine(port);
Console.WriteLine(type);
Console.WriteLine("IP地址是{0},端口号是{1},提供的服务是{2}",ip,port,type);
Console.ReadKey();
方法2:
string s1 = "192.168.1.5[Port=21,Type=ftp]";
string s2 = "192.168.10.5[Port=21]";
//首先是IP
string[] temps = s1.Split("[]".ToCharArray(),StringSplitOptions.RemoveEmptyEntries);
string ip = temps[0];
//下面取出来的是键值对。
string[] subTemps = temps[1].Split(',');
Dictionary<string ,string> dic=new Dictionary<string, string>();
for (int i = 0; i <subTemps.Length; i++)
{
string[] ss = subTemps[i].Split('=');
dic.Add(ss[0],ss[1]); //把键和值放到了集合中。
}
dic.Add("IP",temps[0]);
if(!dic.ContainsKey("Type"))
{
dic.Add("Type","fttp");
}
//循环输出集合中的键和值
foreach (KeyValuePair<string, string> item in dic)
{
Console.WriteLine(item.Key+": "+item.Value);
}
Console.ReadKey();
30天C#基础巩固------了解委托,string练习的更多相关文章
- 30天C#基础巩固------this,base,string中的方法,StringBuilder性能
这里主要是记录下自己学习笔记,希望有个地方在以后可以看到自己走过的路. 关于之前多态的知识有一个口诀,很好理解里面的override和new,virtual关键字. "new则隐藏,over ...
- C#基础篇 - 理解委托和事件
1.委托 委托类似于C++中的函数指针(一个指向内存位置的指针).委托是C#中类型安全的,可以订阅一个或多个具有相同签名方法的函数指针.简单理解,委托是一种可以把函数当做参数传递的类型.很多情况下,某 ...
- C#基础总结之五Dictionary<string, string[]>和while循环
#region 第五天作业 名片集(01) //Dictionary<string, string[]> PersonCard = new Dictionary<string, st ...
- java基础解析系列(九)---String不可变性分析
java基础解析系列(九)---String不可变性分析 目录 java基础解析系列(一)---String.StringBuffer.StringBuilder java基础解析系列(二)---In ...
- Python基础数据类型-字符串(string)
Python基础数据类型-字符串(string) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 本篇博客使用的是Python3.6版本,以及以后分享的每一篇都是Python3.x版 ...
- java基础解析系列(一)---String、StringBuffer、StringBuilder
java基础解析系列(一)---String.StringBuffer.StringBuilder 前言:本系列的主题是平时容易疏忽的知识点,只有基础扎实,在编码的时候才能更注重规范和性能,在出现bu ...
- Java基础-字符串连接运算符String link operator
Java基础-字符串连接运算符String link operator 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 字符串链接运算符是通过“+”进行拼接的. 一.使用“+”进行字 ...
- 基础类型转化成String 转
基础类型转化成String 在程序中你可能时常会需要将别的类型转化成String,有时候可能是一些基础类型的值.在拼接字符串的时候,如果你有两个或者多个基础类型的值需要放到前面,你需要显式的将第一个值 ...
- 30天C#基础巩固------面向鸭子编程,关于string和File的练习
面向对象编程就是面向抽象的父类进行编程,具体的实现不用考虑,由子类决定.<经典的说法--面向鸭子编程> eg:鸭子的编程,<对于多态的理解> 我们都习惯把使用 ...
随机推荐
- google搜索技巧汇总
由于不能访问google,可访问ggso.in进行搜索. 简单整理记录一下常用的一些Google搜索技巧:或操作一般搜索时,如果输入多个词,默认是与的关系,如输入词1和词2,即搜索同时包含词1和词2的 ...
- Homework 3
1. 是否需要有代码规范? 这些规范都是官僚制度下产生的浪费大家的编程时间.影响人们开发效率, 浪费时间的东西. (反对) 我是个艺术家,手艺人,我有自己的规范和原则. (反对) 规范不能强求一律, ...
- Unity3D热更新全书-脚本(二) 两级分化
上篇明确了我们探讨的脚本是什么:是写在文本文件里面的代码,可以作为资源加载,取得字符串再执行. 可是为什么世界上会有那么多的脚本?而其使用方法完全看起来不一样呢?这是因为每种脚本都有自己的定位,在不同 ...
- Linux常用命令(转)
源自:http://www.linuxidc.com/Linux/2011-08/40437.htm Linux管理文件和目录的命令 命令 功能 命令 功能 pwd 显示当前目录 ls 查看目录下的内 ...
- MVVM架构~knockoutjs系列之为validation.js扩展minLength和maxLength
返回目录 为什么要对minLength和maxLength这两个方法进行扩展呢,是因为这样一个需求,在用户注册时,可以由用户自己决定他们输入的字符,中文,英文,数字均可,这样做了之后,使用户的体验更好 ...
- EF架构~在Linq to Entity中使用日期函數
回到目录 眾所周知,在linq to entity的查询语句中,不允许出现ef不能识别的关键字,如Trim,Substring,TotalDays等.net里的关键字,在EF查询里都是不被支持的,它的 ...
- Node.js入门:Hello World
马上开始我们第一个Node.js应用:“Hello World”.打开你的编辑器,创建一个hello.js文件.编写代码保存该文件,并通过Node.js来执行. 控制台输出 1 console.log ...
- C#并行编程-相关概念
菜鸟初步学习,不对的地方请大神指教,参考<C#并行编程高级教程.pdf> 目录 C#并行编程-相关概念 C#并行编程-Parallel C#并行编程-Task C#并行编程-并发集合 C# ...
- Drupal网站开发实践--自定义购物流程
由于Commerce模块自带的购物流程步骤过多,界面不太美观,所以需要重新设计. 改造后的购物流程分成两部:购物车->结算,就两个页面.购物车页面可以修改商品的数量,删除购物车内商品,查看总金额 ...
- JS 内置对象
内置对象的定义:有ECMAScript实现提供的.不依赖与宿主环境的对象,在ECMAScript运行之前就已经创建好的对象就叫做内置对象. 就是说,是不需要我们开发人员先是的实例化对象就能够调用和运行 ...