C#的笔记属性索引器,委托事件,泛型集合,异常捕捉

2023-11-13

C#有一些与其他语言C++Java不同的特性这里特别记一下,他们大部分基本的内容是相同的。

C#有属性索引器,委托事件,泛型集合,trycatchfinally异常捕捉

 

属性Property

属性时一种很像字段的方法,他有getset访问器,使用它可以有限制的访问私有字段。

e.g. 声明私有字段private float age,这是一个私有字段年龄,按照规范,你应该定义一个公开的属性Age,与age同名但是首字母大写,public float Age{get{return age;}set{age = value}},系统并不会识别同名,定义其他名字也是可以的。

属性有点像方法他有方法体,但是又有点不像方法,因为他没有括号。

当你不想写结构体时候,可以空着 public float Age{get;set;},你甚至可以省略定义私有字段,但是这样让属性显得无意义(我现在是这样觉得的,说不定以后会发现这样做的好处)。

当你只写了get,那这个属性就是只读类型,同样也可以只写set,就是只写类型。

索引器Indexer

索引器是加强版的属性,它可以通过索引访问类中元素,他访问的元素往往类中数组或集合的元素。

他的写法也很狂野 public string this[int index]{get;set;} ,使用this做自己的方法名足以见他很自负。

当类中有数组和集合,你不能使用属性去访问了,因为属性不能传入参数,但是索引器可以传入参数,这里index未必是int,它可以是任意类型,同样返回值也可以是任意类型。当你类中有多个不同的数组要访问,但你不能定义不同名字的索引器,你就需要控制参数和返回值来访问不同数组。

委托DELEGATE

委托是一种引用类型变量,他有点像C++指针,他指向某个方法,以此实现回调方法和事件。

委托写法非常奇特,它可以在任何位置声明类里,类外,命名空间外也可,定义一个委托相当于定义一个新类,所有可以定义类的地方都可以定义委托。

//声明,这里的意思是他可以引用一个参数为int,返回值为int的方法。

delegate int NumberChanger(int n);

// 创建委托实例,只看上面你可能会觉得括号里应该填int,但是实际上是填入方法名,而且这个方法名不是任何数据类型,不是string,不能用" "修饰。

NumberChanger nc1 = new NumberChanger(AddNum);

// 使用委托对象调用方法,当你调用的时候你会在括号写一个int作为传入参数。

nc1(25);

有了委托之后,方法引用就可以像一般的参数一样传来传去,他是很多设计模式实现的必要条件如发布订阅者模式。

委托的多播(Multicasting of a Delegate)

你可以使用+操作符和-操作符,在同一个委托名下添加多个引用函数,从而实现多播

// 创建委托实例
NumberChanger nc;
NumberChanger nc1 = new NumberChanger(AddNum);
NumberChanger nc2 = new NumberChanger(MultNum);
nc = nc1;
nc += nc2;
// 调用多播,按次序执行多个委托
nc(5);

类外静态方法需要:类名.方法名,类外普通方法需要:对象名.方法名

创建和添加可以直接写方法名

NumberChanger nc = AddNum;
nc += MultNum;

委托也可写成数组和类一样

NumberChanger[] nc1 = new NumberChanger[] {AddNum,MultNum};

委托可以作为参数或返回值。

 

委托实现发布和订阅者模式。

发布者决定何时调用方法,而订阅者泽决定方法内容,方法的定义和调用完全分离了。

在交通灯案例中,红绿灯是发布者,而不同的车辆时订阅者。

红绿灯拥有一个委托,这个委托中添加了车辆们对红绿灯变化的反应,而红绿灯会在切换时启动委托。

这时红绿灯拥有了调用方法权力,没有定义方法权力;想法车辆们可以定义方法,却不能决定何时调用方法。

有些车辆想闯红灯,红绿灯只能播报进行的自己委托,并不能控制闯红灯。

得益于+-操作,红绿灯可以轻易添加进入路口的车辆,删除离开路口的车辆。

 

事件EVENT

事件是专为发布订阅者模式设计的严格版本的委托,event关键字用来修饰委托名。

//定义一个委托(你要明白:这个委托类型就是事件处理程序的函数类型)

public delegate void delegateRun();

//定义一个事件

//事件的声明与之前委托变量delegate1的声明唯一的区别是多了一个event关键字,且委托写“()”,事件不需要

public event delegateRun eventRun;

事件是一种类型安全的委托,可以类比属性和字段,属性是对字段的封装,其实 事件也就是封装了一个委托。

事件更加严格:

1、事件只能同“+=”和“-=”来绑定方(在事件中这个方法叫事件的处理程序,其实这这种绑定方法就是多播委托的绑定方法
2、只能在类的内部调用(触发)事件,但是委托就可以在类外调用函数那样调用。

Func & Action

委托使用前都要定义public delegate void delegateRun();

为了更加方便使用委托,微软提供两个声明好的委托:Action 和 Func

Action是返回值为void的委托,使用时不定义委托,直接写

Action<string> BookAction = new Action<string>(Book); //尖括号的string为参数类型,Book函数名

Func为返回值不为void的委托

Func<string,string> RetBook = new Func<string,string>(FuncBook);//尖括号前面为参数类型,最后一位为返回值。如果只有一个string,则为空参数,返回值为string的委托

Lambda表达式

一种装B的写法,你可以这样写一个函数

static double Multiply(double p1,double p2) => p1*p2;

 

匿名方法

委托调用方法使用方法名查找。对于简单的方法,在使用委托时候直接定义一个无类,也无方法名的方法,简单便捷易读。

// 实例化委托对象
VoteDelegate votedelegate = new VoteDelegate(new Friend().Vote);

// 使用匿名方法的代码
// 匿名方法内联了一个委托实例(可以对照上面的委托实例化的代码来理解)
// 使用匿名方法后,我们就不需要定义一个Friend类以及单独定义一个投票方法
// 这样就可以减少代码量,代码少了,阅读起来就容易多了,以至于不会让过多的回调方法的定义而弄糊涂了
VoteDelegate votedelegate = delegate(string nickname)
{
    Console.WriteLine("昵称为:{0} 来帮Learning Hard投票了", nickname);
};

// 通过调用托来回调Vote()方法
votedelegate("SomeBody");

Lambda表达式结合匿名方法可以这样写

delegate int del(int i);  

del myDelegate = x => x * x;  

int j = myDelegate(5); //j = 25 

 

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C#的笔记属性索引器,委托事件,泛型集合,异常捕捉 的相关文章

  • 如何检查图像对象与资源中的图像对象是否相同?

    所以我试图创建一个简单的程序 只需在单击图片框中更改图片即可 我目前只使用两张图片 所以我的图片框单击事件函数的代码 看起来像这样 private void pictureBox1 Click object sender EventArgs
  • C# 和 Javascript SHA256 哈希的代码示例

    我有一个在服务器端运行的 C 算法 它对 Base64 编码的字符串进行哈希处理 byte salt Convert FromBase64String serverSalt Step 1 SHA256Managed sha256 new S
  • 如何在列表框项目之间画一条线

    我希望能够用水平线分隔列表框中的每个项目 这只是我用于绘制项目的一些代码 private void symptomsList DrawItem object sender System Windows Forms DrawItemEvent
  • 实时服务器上的 woff 字体 MIME 类型错误

    我有一个 asp net MVC 4 网站 我在其中使用 woff 字体 在 VS IIS 上运行时一切正常 然而 当我将 pate 上传到 1and1 托管 实时服务器 时 我得到以下信息 网络错误 404 未找到 http www co
  • 为什么#pragma optimize("", off)

    我正在审查一个 C MFC 项目 在某些文件的开头有这样一行 pragma optimize off 我知道这会关闭所有以下功能的优化 但这样做的动机通常是什么 我专门使用它来在一组特定代码中获得更好的调试信息 并在优化的情况下编译应用程序
  • 指针问题(仅在发布版本中)

    不确定如何描述这一点 但我在这里 由于某种原因 当尝试创建我的游戏的发布版本进行测试时 它的敌人创建方面不起作用 Enemies e level1 3 e level1 0 Enemies sdlLib 500 2 3 128 250 32
  • 在 Visual Studio 2008 上设置预调试事件

    我想在 Visual Studio 中开始调试程序之前运行一个任务 我每次调试程序时都需要运行此任务 因此构建后事件还不够好 我查看了设置的 调试 选项卡 但没有这样的选项 有什么办法可以做到这一点吗 你唯一可以尝试的 IMO 就是尝试Co
  • C - 找到极限之间的所有友好数字

    首先是定义 一对友好的数字由两个不同的整数组成 其中 第一个整数的除数之和等于第二个整数 并且 第二个整数的除数之和等于第一个整数 完美数是等于其自身约数之和的数 我想做的是制作一个程序 询问用户一个下限和一个上限 然后向他 她提供这两个限
  • 获取没有非标准端口的原始 url (C#)

    第一个问题 环境 MVC C AppHarbor Problem 我正在调用 openid 提供商 并根据域生成绝对回调 url 在我的本地机器上 如果我点击的话 效果很好http localhost 12345 login Request
  • 如何将图像和 POST 数据上传到 Azure 移动服务 ApiController 终结点?

    我正在尝试上传图片and POST表单数据 尽管理想情况下我希望它是json 到我的端点Azure 移动服务应用 我有ApiController method HttpPost Route api upload databaseId sea
  • Qt moc 在头文件中实现?

    是否可以告诉 Qt MOC 我想声明该类并在单个文件中实现它 而不是将它们拆分为 h 和 cpp 文件 如果要在 cpp 文件中声明并实现 QObject 子类 则必须手动包含 moc 文件 例如 文件main cpp struct Sub
  • Web API - 访问 DbContext 类中的 HttpContext

    在我的 C Web API 应用程序中 我添加了CreatedDate and CreatedBy所有表中的列 现在 每当在任何表中添加新记录时 我想填充这些列 为此目的我已经覆盖SaveChanges and SaveChangesAsy
  • for循环中计数器变量的范围是多少?

    我在 Visual Studio 2008 中收到以下错误 Error 1 A local variable named i cannot be declared in this scope because it would give a
  • 当操作繁忙时,表单不执行任何操作(冻结)

    我有一个使用 C 的 WinForms 应用程序 我尝试从文件中读取一些数据并将其插入数据表中 当此操作很忙时 我的表单冻结并且无法移动它 有谁知道我该如何解决这个问题 这可能是因为您在 UI 线程上执行了操作 将文件和数据库操作移至另一个
  • C++ 复制初始化和直接初始化,奇怪的情况

    在继续阅读本文之前 请阅读在 C 中 复制初始化和直接初始化之间有区别吗 https stackoverflow com questions 1051379 is there a difference in c between copy i
  • C++ fmt 库,仅使用格式说明符格式化单个参数

    使用 C fmt 库 并给定一个裸格式说明符 有没有办法使用它来格式化单个参数 example std string str magic format 2f 1 23 current method template
  • WCF:将随机数添加到 UsernameToken

    我正在尝试连接到用 Java 编写的 Web 服务 但有些东西我无法弄清楚 使用 WCF 和 customBinding 几乎一切似乎都很好 除了 SOAP 消息的一部分 因为它缺少 Nonce 和 Created 部分节点 显然我错过了一
  • 32 位到 64 位内联汇编移植

    我有一段 C 代码 在 GNU Linux 环境下用 g 编译 它加载一个函数指针 它如何执行并不重要 使用一些内联汇编将一些参数推送到堆栈上 然后调用该函数 代码如下 unsigned long stack 1 23 33 43 save
  • C 中的异或运算符

    在进行按位操作时 我在确定何时使用 XOR 运算符时遇到一些困难 按位与和或非常简单 当您想要屏蔽位时 请使用按位 AND 常见用例是 IP 寻址和子网掩码 当您想要打开位时 请使用包含或 然而 XOR 总是让我明白 我觉得如果在面试中被问
  • 防止索引超出范围错误

    我想编写对某些条件的检查 而不必使用 try catch 并且我想避免出现 Index Out of Range 错误的可能性 if array Element 0 Object Length gt 0 array Element 1 Ob

随机推荐