const 的概念就是一个包含不能修改的值的变量。常数表达式是在编译时可被完全计算的表达式。因此不能从一个变量中提取的值来初始化常量。如果 const int a = b+1;b是一个变量,显然不能再编译时就计算出结果,所以常量是不可以用变量来初始化的。 readonly 允许把一个字段设置成常量,但可以执行一些运算,可以确定它的初始值。因为 readonly 是在计算时执行的,当然它可以用某些变量初始化。readonly 是实例成员,所以不同的实例可以有不同的常量值,这使readonly更灵活。readonly 关键字与 const 关键字不同。1. const 字段只能在该字段的声...
.Net Framework中的委托与事件
尽管上面的范例很好地完成了我们想要完成的工作,但是我们不仅疑惑:为什么.Net Framework 中的事件模型和上面的不同?为什么有很多的EventArgs参数?
在回答上面的问题之前,我们先搞懂 .Net Framework的编码规范:
l 委托类型的名称都应该以EventHandler结束。
l 委托的原型定义:有一个void返回值,并接受两个输入参数:一个Object 类型,一个 EventArgs类型(或继承自EventArgs)。
l 事件的命名为 委托去掉 E...
事件和委托的编译代码
这时候,我们注释掉编译错误的行,然后重新进行编译,再借助Reflactor来对 event的声明语句做一探究,看看为什么会发生这样的错误:
public event GreetingDelegate MakeGreet;
可以看到,实际上尽管我们在GreetingManager里将 MakeGreet 声明为public,但是,实际上MakeGreet会被编译成 私有字段,难怪会发生上面的编译错误了,因为它根本就不允许在GreetingManager类的外面以赋值的方式访问,从而验证了我们上面所做的推论。
我们再进一步看下MakeGr...
事件的由来
我们继续思考上面的程序:上面的三个方法都定义在Programe类中,这样做是为了理解的方便,实际应用中,通常都是 GreetPeople 在一个类中,ChineseGreeting和 EnglishGreeting 在另外的类中。现在你已经对委托有了初步了解,是时候对上面的例子做个改进了。假设我们将GreetingPeople()放在一个叫GreetingManager的类中,那么新程序应该是这个样子的:
namespace Delegate {
//定义委托,它定义了可以代表的方法的类型
public delegate void Greeti...
将方法绑定到委托
看到这里,是不是有那么点如梦初醒的感觉?于是,你是不是在想:在上面的例子中,我不一定要直接在GreetPeople()方法中给 name参数赋值,我可以像这样使用变量:
static void Main(string[] args) { string name1, name2; name1 = "Jimmy Zhang"; name2 = "张子阳"; GreetPeople(name1, EnglishGreeting); GreetPeople(name2, ChineseGreeting); Console.ReadK...
引言
委托 和 事件在 .Net Framework中的应用非常广泛,然而,较好地理解委托和事件对很多接触C#时间不长的人来说并不容易。它们就像是一道槛儿,过了这个槛的人,觉得真是太容易了,而没有过去的人每次见到委托和事件就觉得心里别(biè)得慌,混身不自在。本文中,我将通过两个范例由浅入深地讲述什么是委托、为什么要使用委托、事件的由来、委托和事件对Observer设计模式的意义、.Net Framework中的委托和事件,对它们的中间代码也做了讨论。
将方法作为方法的参数
我们先不管这个标题如何的绕口,也不管委托究竟是个什么东西,来看下面这两个最简单的方法,它们不过是在屏幕上输...
目的
本文的目的在于揭示和DOTNET及C#相关的一些常见的和不常见的问题。在这些问题中我的第一篇文章和string数据类型有关,string数据类型是一种引用类型,但是当和其他引用类型比较的时候,很多开发人员可能并不能完全理解它的行为。
问题
对于常见的引用类型,当改变一个对象别名的值时,这种变化也同样会在一个实际的对象中表现出来;反之亦然。但是对于string类型,似乎不是这样的。
解释
引用类型
假设我们有一个类MyType,这个类有一个属性Name;我们还有一个类AppType,这个...
C#正则表达式符号模式
字 符
\:转义字符,将一个具有特殊功能的字符转义为一个普通字符,或反过来
^:匹配输入字符串的开始位置
$:匹配输入字符串的结束位置
*:匹配前面的零次或多次的子表达式
+:匹配前面的一次或多次的子表达式
?:匹配前面的零次或一次的子表达式
{n}:n是一个非负整数,匹配前面的n次子表达式
{n,}:n是一个非负整数,至少匹配前面的n次子表达式
{n,m}:m和n均为非负整数,其中n<=m,最少匹配n次且最多匹配m次
?:当该字符紧跟在其他限制符(*,+,?,{n},{n,},{n,m})后面时,匹配模式尽可能少的匹配所搜索的字符串
...
正则表达式基础知识
基本语法
在正则表达式中拥有一套自己的语法规则,常见语法包括;字符匹配、重复匹配、字符定位、转义匹配和其他高级语法(字符分组、字符替换和字符决策);
字符匹配语法:
字符语法
语法解释
语法例子
\d
匹配数字(0~9)
‘\d’匹配8,不匹配12;
\D
匹配非数字
‘\D’匹配c,不匹配3;
\w
匹配任意单字符
‘\w\w’ 匹配A3,不匹配@3;
\W
匹配非单字符
‘\W’匹配@,不匹配c;
\s
匹配空白字符
‘\d\s\d’匹配3 d,不匹...
本文汇集了在.NET中得到计算机硬件信息的一些功能。
得到显示器分辨率 Dim X As Short = System.Windows.Forms.Screen.PrimaryScreen.Bounds.WidthDim Y As Short = System.Windows.Forms.Screen.PrimaryScreen.Bounds.HeightMsgBox("您的显示器分辨率是:" & X & " X " & Y)得到特殊文件夹的路径 '"Desktop"桌面文件夹路径MsgBox(Environment.GetFolderPath(Environm...
详细介绍中间语言
下面就是中间语言的主要特征:
● 面向对象和使用接口
● 值类型和引用类型之间的巨大差别
● 强数据类型
● 使用异常来处理错误
● 使用特性(attribute)
下面详细讨论这些特征。
最近在对AppDomain编程时遇到了一个问题,卸载AppDomain后,在内存中还保留它加载的DLL的数据,所以即使卸载掉AppDomain,还是无法更新它加载的DLL.看来只有关闭整个进程来更新DLL了.
--------------------------------------------------------------------------------------------------------------
我们知道,进程是操作系统用于隔离众多正在运行的应用程序的机制。在.Net之前,每一个应用程序被加载到单独的进程中,并为该进程指定私有的虚拟内存。进程不...
第一章 .NET体系
介绍
学习C#不能孤立地学,必需和.NET框架结合起来。因为C#代码只能在.NET框架下运行。这有两个重要原因:
。C#的体系和方法反应的是.NET的根本方法。
。在许多案例中,C#的特色信赖于.NET或.NET的基本类。
因为这种信赖关系,所以在学习C#之前了解.NET框架是非常必要的。
C#和.NET框架的关系
C#是一门新的语言,有两个主要特点。
。它是为.NET而设计的。 。它是一种面向对象语言。
公共语言运行库
.NET的核心是运行库的执行环境,称为公共语言运行库(CLR)或.NET运行库。通常将在CLR的控制下运行的...
为了使用该控件,可执行以下步骤: 1、在窗体上拖放一个NotifyIcon控件 2、设置NotifyIcon的Icon和Text属性,Icon指定状态栏显示的图标,Text用于显示一个ToolTip 3、在窗体中加入如下代码 1 public partial class Form1 : Form 2 { 3 FormWindowState preState; 4 public Form1() 5 { 6 InitializeComponent(); 7 } 8 9 private v...
1. System.Diagnostics.Process.GetCurrentProcess().MainModule.FileName获取模块的完整路径。2. System.Environment.CurrentDirectory获取和设置当前目录(该进程从中启动的目录)的完全限定目录。3. System.IO.Directory.GetCurrentDirectory()获取应用程序的当前工作目录。这个不一定是程序从中启动的目录啊,有可能程序放在C:\www里,这个函数有可能返回C:\Documents and Settings\ZYB\,或者C:\Program Files\Ad...
using System;
using System.Net;
namespace LoweSoftware.Tools
{
/// <summary>
/// Used to convert and compare IP addresses.
///
/// By Alexander Lowe, Lowe*Software.
/// http://www.lowesoftware.com
///
/// Free for use and modification. No warranty express or
/...
Strings
There really isn't any formatting within a strong, beyond it's alignment. Alignment works for any argument being printed in a String.Format call.
Sample
Generates
String.Format("->{1,10}<-", "Hello");
-> Hello<-
String.Format("->{1,-10}<-", "Hello");
->Hello <-
Number...