你可能不知道的C#语言特性

关键字

  • yield

通常用于迭代器中,向IEnumerable对象提供值或者结束迭代。

如:

yield return expression;
yield break;
  • var

用于定义隐式类型的变量。

var i = 5;
var s = "Hello";

注意隐式类型(Implicitly typed)并不是“动态类型“,由编译器在编译时候决定具体类型。

default除了在switch语句中提供默认的条件之外,还作为关键字用于泛型中。比如:

T temp = default(T);

由于事先不知道T类型是引用还是值类型,无法用于和null(只有引用类型可以)或者数字(值类型才能和其比较)进行比较。用default关键字,会确保如果是引用类型则返回null,如果是值类型则返回0。

关键字global::用于引用全局命名空间。

class TestClass : global::TestApp { }

用于多线程中表示这个字段可以由多个同时执行的线程修改。更多有关如何使用volatile多线程的例子,可以参考如何:创建和终止线程。

public volatile int i;

C#中可以用extern修饰符声明外部实现的方法。常用于Interop服务使用非托管代码与DllImport属性一起使用(同时要声明static),如:

[DllImport("avifil32.dll")]
private static extern void AVIFileInit();

C#中可以同时引用两个类型名完全相同的程序集(常见同一控件的多个版本),这时候使用外部命令行指定别名引用,比如:

/r:GridV1=grid.dll
/r:GridV2=grid20.dll 

在程序中使用它们的时候,需要用关键extern来引用它们:

extern alias GridV1;
extern alias GridV2; 

GridV1和GridV2会被引用进和全局命名空间同级别的额外空间,使用GridV1::Grid或者GridV2::Grid可以得到不同版本的Grid类型。

 

语法

  • ??操作符

null合并运算符,用于定义可以为null值的引用类型的默认值。如果左操作数不为null,则返回左操作数,反之返回右操作数。

 int y = x ?? -1;

同时这里也是null运算符:

static int? GetNullableInt()
{
return null;
}
//... or
int? x = null;
  • where T:new()

我们知道可以用where关键字来对泛型定义进行约束,比如:

public class MyClass<T, U>
where T : class
where U : struct
{}

同时我们可以对泛型定义中包含构造函数的约束,new()约束告诉编译器提供的任何类型的参数都含有一个无参数的(默认)构造方法。

public class MyGenericClass<T> where T : IComparable, new()
{
T item = new T();
}

语言特性

  • Nullable类型

当我们要描述一个值类型可以不存在的的时候,使用nullable类型取代值类型。

使用?修饰符来声明一个nullable类型,比如:

int? a = 1;

C#通过Nullable类和Nullable结构体来支持nullable类型,Nullable结构体含有两个有用属性HasValue和Value来判断和获取当前类型是否还有值。

  • Curry化

这个名词对.NET的朋友可能有点生疏,wikipedia给的翻译是“柯里化”- 个人不太喜欢这个名字,英文是currying。curry化是函数式编程的一种实现技术。大致过程,就是把本来接受多个参数的函数,变成只有第一个参数的函数,然后返回新函数接受余下的参数。有点拗口,而且对函数式编程或curry化介绍的中文资料也相对较少,我读过一篇对函数式编程和curry化解释的比较清楚的文章还有这篇英文的博客,推荐大家看看。

所有能实现闭包的语言都可以实现curry化。在C#2.0中可以通过匿名委托来实现,在3.0中curry化相对简单一些:

static class Program
{
static Func<TArg1, Func<TArg2, TResult>> Curry<TArg1, TArg2, TResult>(this Func<TArg1,
TArg2, TResult> f) { return a1 => a2 => f(a1, a2); } static void Main() { Func<int, int, int> add = (x, y) => x + y; var curriedAdd = add.Curry(); Console.WriteLine(curriedAdd(13)(29)); } }

最后,如果大家对用C#实现函数式编程有兴趣,可以在MSDN Code中找到更多的代码实现。

  • 匿名类型

匿名类型可用来将一组只读属性封装到单个对象中,而无需首先显式定义一个类型。类型名称由编译器生成,并且不能在源代码级使用,类型也由编译器推断决定。常和LINQ查询表达式的select子句结合使用,初始化其他类型的属性组成的对象。

var productQuery =
from prod in products
select new { prod.Color, prod.Price }; foreach (var v in productQuery)
{
Console.WriteLine("Color={0}, Price={1}", v.Color, v.Price);
}
  • 扩展方法

    C#3.0中可以对CLR扩充类型,比如,你可能需要得到一句英文字符串中有多少个单词,以往可以写一个处理string的方法,现在你可以直接为string类型添加一个计算单词数量的方法:
namespace ExtensionMethods
{
public static class MyExtensions
{
public static int WordCount(this String str)
{
return str.Split(new char[] { ' ', '.', '?' }, StringSplitOptions.RemoveEmptyEntries).Length;
}
}
}

 

通过this我们把这个WordCount方法扩充到了CLR内置类型,你可以直接像用普通方法一样使用它:

using ExtensionMethods;
//...
string s = "Hello Extension Methods";
int i = s.WordCount();

更多介绍可以参考MSDN或者ScottGu的博客。

 

方法和属性

  • List.ForEach()

Array或List有个很实用的ForEach方法,可以直接传入一个方法对集合中元素操作。如:

List<String> names = new List<String>();
names.Add("Bruce");
names.Add("Alfred");
names.ForEach(Print);
names.ForEach(delegate(String name)
{
Console.WriteLine(name);
});
private static void Print(string s)
{
Console.WriteLine(s);
}
  • GetValueOrDefault

对于nullable类型的对象,除了Value和HasValue两个常用属性外,还可以使用GetValueOrDefault方法来获得当前值或者默认值:

float? mySingle = 12.34f;
float? yourSingle = -1.0f;
yourSingle = mySingle.GetValueOrDefault(-222.22f); // yourSingle=12.34
mySingle = null;
yourSingle = mySingle.GetValueOrDefault(); // yourSingle=0

 

技巧

  • 使用大写字母比较字符串

摘自CLR via C#:

当比较字符串时候,推荐使用ToUpperInvariant 转换成大写而不是ToLowerInvariant 成小写。因为微软在比较大写字符串的时候对代码做了优化。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/304992.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

c语言中文件如何插入数据,急求如何将下列C语言程序数据存储到文件中?

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼求如何改动才能将下列程序的存储输入或输出数据(或两者一起)到指定的文件(或运行时直接创立一个文件)如Arrangement中。#include int n0;int rest[7][7]; //全局声明,以供全局调用int main(){void perm(int list[],int ,int );int …

python字符串设置字体_python怎么更改字符串后几位

python更改字符串后几位的方法&#xff1a;可以利用replace()函数来实现。replace()函数可以把字符串中的旧字符串替换成新字符串&#xff0c;并返回替换后的新字符串。具体使用方法如&#xff1a;【str.replace("is", "was")】。可以利用replace()函数来修…

使用 Tye 辅助开发 k8s 应用竟如此简单(二)

续上篇&#xff0c;这篇我们来进一步探索 Tye 更多的使用方法。本篇我们来了解一下如何在 Tye 中使用服务发现。服务发现 - 微服务开发不可缺少的部件 服务发现&#xff0c;就是新注册的这个服务模块能够及时的被其他调用者发现。不管是服务新增和服务删减都能实现自动发现。《…

程序猿的双十一最佳攻略

讲个恐怖故事 一年一度虐汪“光棍节”又来了 小天拍拍&#xff08;不存在的&#xff09;胸脯告诉大家 这个节日 我陪你们 买买买&#xff01; 限时特惠专场 1 welcome 7天教你学会数学建模及Matlab编程 数学建模涉及的内容比较广泛&#xff0c;比如碎纸片问题中所涉及的图像识…

傅里叶变换音频可视化_HTML5如何实现音频可视化频谱跳动

本篇教程探讨了HTML5如何实现音频可视化频谱跳动&#xff0c;希望阅读本篇文章以后大家有所收获&#xff0c;帮助大家HTML5CSS3从入门到精通 。<html>HTML5音频可视化频谱跳动代码* {margin: 0;padding: 0;}#canvas {display: block;background: linear-gradient(135deg,…

android websocket封装,Android WebSocket 方案选型OkHttp

目前Android WebSocket 框架 主要包括:SocketIOJava-WebSocketOkHttp WebSocket一开始我首选的是采用SocketIO方案&#xff0c;因为考虑该方案封装接口好&#xff0c;提供异步回调机制&#xff0c;但和后端同事沟通发现目前客户端的SocketIO不支持ws wss协议, 所以无奈只能放弃…

关于Word中审阅的一个问题!

前两天&#xff0c;在帮一个杂志撰稿的过程中&#xff0c;有一个关于Word审阅的问题。&#xff08;以下内容以Word2007为例&#xff09; 本身&#xff0c;审阅的应用不算困难。 我们可以为文章添加“批注”&#xff0c;或是你的上级对文章进行修改&#xff0c;他们可以开启“审…

ASP.NET Core - 在ActionFilter中使用依赖注入

上次ActionFilter引发的一个EF异常,本质上是对Core版本的ActionFilter的知识掌握不够牢固造成的&#xff0c;所以花了点时间仔细阅读了微软的官方文档。发现除了IActionFilter、IAsyncActionFilter的问题&#xff0c;还有一个就是依赖注入在ActionFilter上的使用也是需要注意的…

魏尔斯特拉斯函数与分形图形的动画演示

一般人会直觉上认为连续的函数必然是近乎可导的。即使不可导&#xff0c;所谓不可导的点也必然只占整体的一小部分。根据魏尔斯特拉斯在他的论文中所描述&#xff0c;早期的许多数学家&#xff0c;包括高斯&#xff0c;都曾经假定连续函数不可导的部分是有限或可数的。这可能是…

大脚战场插件怎么关闭_PM工具栏插件:HonmToolBar

视频演示&#xff1a;问&#xff1a;HonmToolBar是一款什么样的插件&#xff1f;答&#xff1a;HonmToolBar是一款高度自由化的插件&#xff0c;用户可以自己增加宏文件按钮或者宏命令按钮。该插件类似工具栏&#xff0c;有水平和垂直两个工具栏。插件悬浮在PM图形窗口左上角&a…

android 导航 美国,变美了 Android N或用全新虚拟导航按键

原标题&#xff1a;变美了 Android N或用全新虚拟导航按键变美了 Android N或用全新虚拟导航按键【IT168 资讯】虽然距离谷歌Android N系统的发布已经有一段时间了&#xff0c;不过该系统目前仍旧属于内测阶段&#xff0c;短时间内仍难以迅速推广。另外也正是由于Android N正式…

唐骏的商业模式

唐骏曾把商业模式比作谈恋爱&#xff0c;其要抓住三个要点&#xff1a; 1、简单&#xff1a; 太多的环节很难让人接受&#xff0c;并且容易潜藏缺陷&#xff0c;一目了然最好不过&#xff01; 2、有创意&#xff1a; 一定要有自己独特的创意&#xff0c;一位跟随别人&#xff0…

python特性和属性_Python面向对象-类的特性及公私有属性 | 【韩涛博客】

构造函数 __init__ self.name name #属性&#xff0c;成员变量&#xff0c;字段 def sayhi() #方法&#xff0c;动态属性 公有属性 在类中直接定义的属性&#xff0c;大家都可以用 私有属性 __两个下划线定义&#xff0c;外部不可以访问&#xff0c;内部可以访问 class Role(o…

[Abp 源码分析]自动审计记录

点击上方蓝字关注我们0.简介Abp 框架为我们自带了审计日志功能&#xff0c;审计日志可以方便地查看每次请求接口所耗的时间&#xff0c;能够帮助我们快速定位到某些性能有问题的接口。除此之外&#xff0c;审计日志信息还包含有每次调用接口时客户端请求的参数信息&#xff0c;…

我的老公是枚码农

前两天看到一篇写程序员的爆文&#xff0c;虽然略显夸张&#xff0c;但也着实有趣。忽然想到身边人也是一枚码农&#xff0c;浑身上下也是浓厚的码农气息&#xff0c;遂也胡乱写了几笔&#xff0c;博君一笑&#xff0c;为了方便起见&#xff0c;就称其为“码农哥”。 1 码农哥还…

如何修复硬盘坏道?

首先需要先确认硬盘的坏道是逻辑坏道还是物理坏道。 方法很简单&#xff0c;在电脑刚启动时按“F8”键&#xff0c;选择“Command Prompt only”进入DOS模式。这种方法的操作系统必须为Windows95/98&#xff0c;若为Windows2000/XP/2003&#xff0c;请使用DOS启动盘启动。然后执…

c++11 string u8_深入理解C++11:C++11新

一.数据对齐在了解为什么数据需要对齐之前&#xff0c;我们可以回顾一下打印结构体的大小这个C/C中的经典案例。先看代码&#xff1a;#include using namespace std;struct HowManyBytes{char a;int b;};int main(){cout<>endl;cout<>endl;cout<>endl;cout&l…

harmonyos con,鸿蒙HarmonyOS系统中的JS开发框架

HarmonyOS开源至今已经一个多月&#xff0c;源码托管在国内知名开源平台码云上&#xff0c;https://gitee.com/openharmony 。我最感兴趣的就是JS 框架 ace_lite_jsfwk&#xff0c;从名字中可以看出来这是一个非常轻量级的框架&#xff0c;官方介绍说是“轻量级 JS 核心开发框架…

python公式_Python读取excel文件中带公式的值的实现

在进行excel文件读取的时候&#xff0c;我自己设置了部分直接从公式获取单元格的值 但是用之前的读取方法进行读取的时候&#xff0c;返回值为空 import os import xlrd from xlutils.copy import copy file_path os.path.abspath(os.path.dirname(__file__)) # 获取当前文件目…

.NET工资低?那肯定是你打开的方式不正确

点击上方蓝字关注我们因为工作的关系&#xff0c;本人总是会接触到一些刚踏入社会没多久的.NET开发小伙伴。尤其是年关将近&#xff0c;这时候想要跳槽的人特别多&#xff0c;所以收到一些小伙伴的迷茫求解。今天就拿其中一个来说&#xff0c;我们暂且称他为A同学吧。A同学是一…