一、ObservableCollection和List的区别 1)ObservableCollection比较简单,继承了Collection, INotifyCollectionChanged, INotifyPropertyChanged Collection:为泛型集合提供基类。 INotifyCollectionChanged:将集合的动态更改通知给侦听器,例如,何时添加和移除项或者重置整个集合对象。 INotifyPropertyChanged:向客户端发出某一属性值已更改的通知。 所以再ObservableCollectio...
C# 中的 反射 常用于在程序的运行时获取 类型 的元数据,可获取的信息包括已加载到进程中的 程序集 和 类型 信息,它和 C++ 中的 RTTI(Runtime Type Information) 的作用是差不多的。 为了能够使用反射,需要在项目中引用 System.Reflection 命名空间,在使用反射的开始,你会获取一个 Type 类型的对象,从这个对象上进一步获取 程序集,类型,模块 等信息,可以通过 反射 动态的生成...
一、枚举的概念 C# 枚举(Enum), 枚举类型是用于声明一组命名的常数的基本数据类型(值类型); 二、枚举的定义 声明 enum 变量: enum {enumeration list}; 其中 enum_name 指定枚举的类型名称,enumeration list 是一个用逗号分隔的标识符列表; 枚举列表中的每个符号代表一个整数值,一个比他前面的符号大的整数值。默认情况下,第一个枚举符号的值是 0。例如: enum Days {S...
通过代码操作防火墙的方式有两种:一是代码操作修改注册表启用或关闭防火墙;二是直接操作防火墙对象来启用或关闭防火墙。不论哪一种方式,都需要使用管理员权限,所以操作前需要判断程序是否具有管理员权限。 1、判断程序是否拥有管理员权限 需要引用命名空间:System.Security.Principal /// 判断程序是否拥有管理员权限 /// true:是管理员;false:不是管理员 public static bo...
一:背景 1. 讲故事 .NET5 终于在 2020-08-25 也就是前天发布了第八个预览版,这么多的预览版搞得我都麻木了,接踵而来的就是更多的新特性加入到了 C# 9 中,既然还想呆在这条船上,得继续硬着头皮学习哈,这一篇跟大家聊聊新增的几个关键词。 二:新增关键词 1. init 出来一个新语法糖,首先要做的就是去揭它的老底,这样可以方便推测它的应用场景,为了方便表述,我先上一个例子: ...
使用复合赋值和循环语句 使用 while 语句,可在条件为 true 的前提下重复运行一个语句。while 语句的语法如下: while ( booleanExpression ) statement 先求值 booleanExpression(布尔表达式,注意必须放在圆括号中),如果为 true,就运行语句 (statement)。再次求值 booleanExpression,仍为 true 就再次运行语句。再次求值 booleanExpression……这个过程一直继续,直至结果为 false...
逻辑AND(逻辑与)操作符(用&&表示)和逻辑OR(逻辑或) 操作符(用||表示)。这两个操作符统称条件逻辑操作符。 只有作为操作数的两个布尔表达式都为 true。 操作符&&和||都支持短路求值 例如,假定操作符&& 的左操作数求值为 false,整个表达式的结果肯定是 false,无论右操作数的值是什么 if 语句的语法如下所示(if 和 else 是 C#关键字): if ( booleanExp...
方法是具名的语句序列 returnType methodName ( parameterList ) { // 这里添加方法主体语句 } returnType(返回类型)是类型名称,指定方法返回的数据类型。可以是任何类型, 如 int 或 string。要写不返回值的方法,必须用关键字 void 取代 returnType。 methodName(方法名)是调用方法时所用的名称。方法名和变量名遵循相同的标识符命名规则。例如,addValues 是有效方法名...
标识符是对程序中的各个元素进行标识的名称。 只能使用字母(大写和小写)、数字和下划线 标识符必须以字母或下划线开头 变量是容纳值的存储位置。可将变量想象成容纳临时信息的容器 命名变量的建议: 不要以下划线开头。 不要创建仅大小写不同的标识符。 名称以小写字母开头。 在包含多个单词的标识符中,从第二个单词起,每个单词都首字母大写(称为camelCas...
1.1 开始在Visual Studio 2013环境中编程 控制台应用程序是在命令提示符窗口而非图形用户界面(GUI)中运行的应用程序。 集成开发环境(Integrated Development Environment,IDE) 1.2 编写第一个程序 Program.cs 文件定义了Program类,其中包含Main方法。在C#中,所有的可是执行代码都必须在方法中定义,而方法必须从属于类或结构。 Main方法指定程序的入口。该方法在Program类中必须...
根据Go开发团队和基本的算法测试,Go语言与C语言的性能差距大概在10%~20%之间。虽然没有官方的性能标准,但是与其它各个语言相比已经拥有非常出色的表现。 时下流行的语言大都是运行在虚拟机上,如:Java和Scala使用的JVM,C#和VB.NET使用的.NETCLR。尽管虚拟机的性能已经有了很大的提升,但任何使用JIT编译器和脚本语言解释器的编程语言(Ruby、Python、Perl和JavaScript)在C和C++的...
Go语言语法类似于C语言,因此熟悉C语言及其派生语言(C++、C#、Objective-C等)的人都会迅速熟悉这门语言。 C语言的有些语法会让代码可读性降低甚至发生歧义。Go语言在C语言的基础上取其精华,弃其糟粕,将C语言中较为容易发生错误的写法进行调整,做出相应的编译提示。 1)去掉循环冗余括号 Go语言在众多大师的丰富实战经验的基础上诞生,去除了C语言语法中一些冗余、烦琐的部分。下面...
Go语言中现阶段没有枚举,可以使用const常量配合上一节《Go语言常量》中介绍的iota来模拟枚举,请看下面的代码: typeWeaponintconst(ArrowWeapon=iota//开始生成枚举值,默认为0ShurikenSniperRifleRifleBlower)//输出所有枚举值fmt.Println(Arrow,Shuriken,SniperRifle,Rifle,Blower)//使用枚举类型并赋初值varweaponWeapon=Blowerfmt.Println(weapon) 代码输出如下:12344 代码说明...
函数构成代码执行的逻辑结构。在Go语言中,函数的基本组成为:关键字func、函数名、参数列表、返回值、函数体和返回语句。 每一个程序都包含很多的函数:函数是基本的代码块。 因为Go语言是编译型语言,所以函数编写的顺序是无关紧要的;鉴于可读性的需求,最好把main()函数写在文件的前面,其他函数按照一定逻辑顺序进行编写(例如函数被调用的顺序)。 编写多个函数的主要目的是将一...
Go语言的匿名函数就是一个闭包,闭包是可以包含自由(未绑定到特定对象)变量的代码块,这些变量不在这个代码块内或者任何全局上下文中定义,而是在定义代码块的环境中定义。要执行的代码块(由于自由变量包含在代码块中,所以这些自由变量以及它们引用的对象没有被释放)为自由变量提供绑定的计算环境(作用域)。 闭包的价值在于可以作为函数对象或者匿名函数,对于类型系统而言,这...
Go语言中关键字defer允许我们推迟到函数返回之前(或任意位置执行return语句之后)一刻才执行某个语句或函数(为什么要在返回之后才执行这些语句?因为return语句同样可以包含一些操作,而不是单纯地返回某个值)。 关键字defer的用法类似于面向对象编程语言Java和C#的finally语句块,它一般用于释放某些已分配的资源。典型的例子就是对一个互斥解锁,或者关闭一个文件。 多个延迟执行...
Go语言可以将类型的方法与普通函数视为一个概念,从而简化方法和函数混合作为回调类型时的复杂性。这个特性和C#中的代理(delegate)类似,调用者无须关心谁来支持调用,系统会自动处理是否调用普通函数或类型的方法。 本节中,首先将用简单的例子了解Go语言是如何将方法与函数视为一个概念,接着会实现一个事件系统,事件系统能有效地将事件触发与响应两端代码解耦。 方法和函数的统...
在面向对象思想中,实现对象关系需要使用“继承”特性。例如,人类不能飞行,鸟类可以飞行。人类和鸟类都可以继承自可行走类,但只有鸟类继承自飞行类。 面向对象的设计原则中也建议对象最好不要使用多重继承,有些面向对象语言从语言层面就禁止了多重继承,如C#和Java语言。鸟类同时继承自可行走类和飞行类,这显然是存在问题的。在面向对象思想中要正确地实现对象的多重特...
Go语言不是一种“传统”的面向对象编程语言:它里面没有类和继承的概念。 但是Go语言里有非常灵活的接口概念,通过它可以实现很多面向对象的特性。很多面向对象的语言都有相似的接口概念,但Go语言中接口类型的独特之处在于它是满足隐式实现的。也就是说,我们没有必要对于给定的具体类型定义所有满足的接口类型;简单地拥有一些必需的方法就足够了。 这种设计可以让你创建...
空接口是接口类型的特殊形式,空接口没有任何方法,因此任何类型都无须实现空接口。从实现的角度看,任何值都满足这个接口的需求。因此空接口类型可以保存任何值,也可以从空接口中取出原值。 提示 空接口类型类似于C#或Java语言中的Object、C语言中的void*、C++中的std::any。在泛型和模板出现前,空接口是一种非常灵活的数据抽象保存和使用的方法。 空接口的内部实现保存了对象的类...