怎样用委托把list中的值赋值到label上去

totodele 2010-12-27 04:38:44
List<string> list = new List<string>();
string strTemp = this.sp.ReadTo("\r\n").Replace("\0", "");

int count = 0;
int num = 0;
foreach (Control ctl in this.label1.Parent.Controls)
{
count++;
if (list.Count == 0)
{
if (ctl.Text == "0000000000")
{
list.Add(strTemp);
}
}
}
...全文
162 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
wuyq11 2010-12-28
  • 打赏
  • 举报
回复
invoke操作
public delegate void Test(int index);
public partial class Form1 : Form {
private Test TestProgress;
public Form1() {
InitializeComponent();
this.TestProgress= new Test(Te);
}
private void Te(int index) {
if (this.InvokeRequired) {
this.Invoke(this.TestProgress, new object[] { index });
}
else {
this.label1.Text = index.ToString();
}
}
private void button1_Click(object sender, EventArgs e) {
Thread thread = new Thread(new ThreadStart(ThreadMethod));
thread.Start();
}
private void ThreadMethod() {
int i = 0;
while (true) {
Thread.Sleep(1000);
i++;
this.TestProgress(i);
}
}
}
totodele 2010-12-28
  • 打赏
  • 举报
回复
if (list.Count == 0)
我前面写的这个判断是当扫描枪每次扫描时候都重新创建了一次list 所以这样写的
但是,用委托去把list中的值复制到 当前的label中我不会用委托求助
totodele 2010-12-28
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 wxr0323 的回复:]
引用 1 楼 totodele 的回复:

对委托一知半解 脑子很混 坐等高手 求解...

没看懂你的代码 你想实现什么功能?
一个Lable 赋 多个值?
还是多个Lable 多个值?
[/Quote]多个label 通过扫描枪扫描一个赋一个 label中的 初值赋的是“000000” 扫描后的值把原本的值替换掉

List<string> list = new List<string>();
string strTemp = this.sp.ReadTo("\r\n").Replace("\0", "");//扫描得到的值

int count = 0;
int num = 0;
foreach (Control ctl in this.label1.Parent.Controls)//遍历label
{
count++;

if (ctl.Text == "0000000000")//判断当label中值为“000000”进入
{
如何让它扫描一个修改一个label呢,怎样去做判断呢
list.Add(strTemp);//添加进list
利用委托给label赋值
}

}
子夜__ 2010-12-27
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 totodele 的回复:]

对委托一知半解 脑子很混 坐等高手 求解...
[/Quote]
多贴点儿代码上来
子夜__ 2010-12-27
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 totodele 的回复:]

对委托一知半解 脑子很混 坐等高手 求解...
[/Quote]
没看懂你的代码 你想实现什么功能?
一个Lable 赋 多个值?
还是多个Lable 多个值?
totodele 2010-12-27
  • 打赏
  • 举报
回复
对委托一知半解 脑子很混 坐等高手 求解...
在一小时内学会 C#。使用例程,简单却完整的探索 C# 语言的构造和特点。本文特别适合有 C++ 基础却没有太多精力学习 C# 的读者。 关于作者 Aisha Ikram 我现在在英国一家软件公司任技术带头人。我是计算机科学的硕士。我主要使用 .NET 1.1/2.0, C#, VB.NET, ASP.NET, VC++ 6, MFC, ATL, COM/DCOM, SQL Server 2000/2005等。最近我在学习 .NET 3.x 的全部内容。我的免费源代码和文章网站是 http://aishai.netfirms.com 职业:团队带头人 位置:英国 简介 C# 是一种具有 C++ 特性,Java 样式及 BASIC 快速建模特性的编程语言。如果你已经知晓 C++ 语言,本文将在不到一小时的时间内带你快速浏览 C# 的语法。如果熟悉 Java 语言,Java 的编程结构、打包和垃圾回收的概念肯定对你快速学习 C# 大有帮助。所以我在讨论 C# 语言构造的时候会假设你知道 C++。 本文通过一系列例程以简短但全面的方式讨论了 C# 语言构造和特性,所以你仅需略览代码片刻,即可了解其概念。 注意:本文不是为 C# 宗师而写。有很多初学者的 C# 文章,这只是其之一。 接下来关于 C# 的讨论主题: ? 编程结构 ? 命名空间 ? 数据类型 ? 变量 ? 运算符与表达式 ? 枚举 ? 语句 ? 类与结构 ? 修饰符 ? 属性 ? 接口 ? 函数参数 ? 数组 ? 索引器 ? 装箱与拆箱 ? 委托 ? 继承与多态 以下主题不会进行讨论: ? C++ 与 C# 的共同点 ? 诸如垃圾回收、线程、文件处理等概念 ? 数据类型转换 ? 异常处理 ? .NET 库 编程结构 和 C++ 一样,C# 是大小写敏感的。半角分号(;)是语句分隔符。和 C++ 有所区别的是,C# 没有单独的声明(头)和实现(CPP)文件。所有代码(类声明和实现)都放在扩展名为 cs 的单一文件。 看看 C# 的 Hello World 程序。 复制内容到剪贴板 代码: using System; namespace MyNameSpace { class HelloWorld { static void Main(string[] args) { Console.WriteLine ("Hello World"); } } } C# 所有内容都打包在类,而所有的类又打包在命名空间(正如文件存与文件夹)。和 C++ 一样,有一个主函数作为你程序的入口点。C++ 的主函数名为 main,而 C# 是大写 M 打头的 Main。 类块或结构定义之后没有必要再加一个半角分号。C++ 是这样,但 C# 不要求。 命名空间 每个类都打包于一个命名空间。命名空间的概念和 C++ 完全一样,但我们在 C# 比在 C++ 更加频繁的使用命名空间。你可以用点(.)定界符访问命名空间的类。上面的 Hello World 程序,MyNameSpace 是其命名空间。 现在思考当你要从其他命名空间的类访问 HelloWorld 类。 复制内容到剪贴板 代码: using System; namespace AnotherNameSpace { class AnotherClass { public void Func() { Console.WriteLine ("Hello World"); } } } 现在在你的 HelloWorld 类你可以这样访问: 复制内容到剪贴板 代码: using System; using AnotherNameSpace; // 你可以增加这条语句 namespace MyNameSpace { class HelloWorld { static void Main(string[] args) { AnotherClass obj = new AnotherClass(); obj.Func(); } } } 在 .NET 库,System 是包含其他命名空间的顶层命名空间。默认情况下存在一个全局命名空间,所以在命名空间外定义的类直接进到此全局命名空间,因而你可以不用定界符访问此类。 你同样可以定义嵌套命名空间。 Using #include 指示符被后跟命名空间名的 using 关键字代替了。正如上面的 using System。System 是最基层的命名空间,所有其他命名空间和类都包含于其。System 命名空间所有对象的基类是 Object。 变量 除了以下差异,C# 的变量几乎和 C++ 一样: 1. C# (不同于 C++)的变量,总是需要你在访问它们前先进行初始化,否则你将遇到编译时错误。故而,不可能访问未初始化的变量。 2. 你不能在 C# 访问一个“挂起”指针。 3. 超出数组边界的表达式索引同样不可访问。 4. C# 没有全局变量或全局函数,取而代之的是通过静态函数和静态变量完成的。 数据类型 所有 C# 的类型都是从 object 类继承的。有两种数据类型: 1. 基本/内建类型 2. 用户定义类型 以下是 C# 内建类型的列表: 类型 字节 描述 byte 1 unsigned byte sbyte 1 signed byte short 2 signed short ushort 2 unsigned short int 4 signed integer uint 4 unsigned integer long 8 signed long ulong 8 unsigned long float 4 floating point number double 8 double precision number decimal 8 fixed precision number string - Unicode string char - Unicode char bool true, false boolean 注意:C# 的类型范围和 C++ 不同。例如:long 在 C++ 是 4 字节而在 C# 是 8 字节。bool 和 string 类型均和 C++ 不同。bool 仅接受真、假而非任意整数。 用户定义类型文件包含: 1. 类 (class) 2. 结构(struct) 3. 接口(interface) 以下类型继承时均分配内存: 1. 类型 2. 参考类型 类型 类型是在堆栈分配的数据类型。它们包括了: ? 除字符串,所有基本和内建类型 ? 结构 ? 枚举类型 引用类型 引用类型在堆(heap)分配内存且当其不再使用时,将自动进行垃圾清理。和 C++ 要求用户显示创建 delete 运算符不一样,它们使用新运算符创建,且没有 delete 运算符。在 C# 它们自动由垃圾回收系统回收。 引用类型包括: ? 类 ? 接口 ? 集合类型如数组 ? 字符串 枚举 C# 的枚举和 C++ 完全一样。通过关键字 enum 定义。 例子: 复制内容到剪贴板 代码: enum Weekdays { Saturday, Sunday, Monday, Tuesday, Wednesday, Thursday, Friday } 类与结构 除了内存分配的不同外,类和结构就和 C++ 的情况一样。类的对象在堆分配,并使用 new 关键字创建。而结构是在栈(stack)进行分配。C# 的结构属于轻量级快速数据类型。当需要大型数据类型时,你应该创建类。 例子: 复制内容到剪贴板 代码: struct Date { int day; int month; int year; } class Date { int day; int month; int year; string weekday; string monthName; public int GetDay() { return day; } public int GetMonth() { return month; } public int GetYear() { return year; } public void SetDay(int Day) { day = Day ; } public void SetMonth(int Month) { month = Month; } public void SetYear(int Year) { year = Year; } public bool IsLeapYear() { return (year/4 == 0); } public void SetDate (int day, int month, int year) { } ... } 属性 如果你熟悉 C++ 面向对象的方法,你一定对属性有自己的认识。对 C++ 来说,前面例子 Date 类的属性就是 day、month 和 year,而你添加了 Get 和 Set 方法。C# 提供了一种更加便捷、简单而又直接的属性访问方式。 所以上面的类应该写成这样: 复制内容到剪贴板 代码: using System; class Date { public int Day{ get { return day; } set { day = value; } } int day; public int Month{ get { return month; } set { month = value; } } int month; public int Year{ get { return year; } set { year = value; } } int year; public bool IsLeapYear(int year) { return year%4== 0 ? true: false; } public void SetDate (int day, int month, int year) { this.day = day; this.month = month; this.year = year; } } 这里是你 get 和 set 属性的方法: 复制内容到剪贴板 代码: class User { public static void Main() { Date date = new Date(); date.Day = 27; date.Month = 6; date.Year = 2003; Console.WriteLine ("Date: {0}/{1}/{2}", date.Day, date.Month, date.Year); } } 修饰符 你必须知道 C++ 常用的 public、private 和 protected 修饰符。我将在这里讨论一些 C# 引入的新的修饰符。 readonly readonly 修饰符仅用于修饰类的数据成员。正如其名字说的,一旦它们已经进行了写操作、直接初始化或在构造函数对其进行了,readonly 数据成员就只能对其进行读取。readonly 和 const 数据成员不同之处在于 const 要求你在声明时进行直接初始化。看下面的例程: 复制内容到剪贴板 代码: class MyClass { const int constInt = 100; //直接进行 readonly int myInt = 5; //直接进行 readonly int myInt2; public MyClass() { myInt2 = 8; //间接进行 } public Func() { myInt = 7; //非法 Console.WriteLine(myInt2.ToString()); } } sealed 带有 sealed 修饰符的类不允许你从它继承任何类。所以如果你不想一个类被继承,你可以对该类使用 sealed 关键字。 复制内容到剪贴板 代码: sealed class CanNotbeTheParent { int a = 5; } unsafe 你可以使用 unsafe 修饰符在 C# 定义一个不安全上下文。在不安全上下文,你可以插入不安全代码,如 C++ 的指针等。参见以下代码: 复制内容到剪贴板 代码: public unsafe MyFunction( int * pInt, double* pDouble) { int* pAnotherInt = new int; *pAnotherInt = 10; pInt = pAnotherInt; ... *pDouble = 8.9; } 接口 如果你有 COM 的思想,你马上就知道我在说什么了。接口是只包含函数签名而在子类实现的抽象基类。在 C# ,你可以用 interface 关键字声明这样的接口类。.NET 就是基于这样的接口的。C# 你不能对类进行多重继承——这在 C++ 是允许的。通过接口,多重继承的精髓得以实现。即你的子类可以实现多重接口。(译注:由此可以实现多重继承) 复制内容到剪贴板 代码: using System; interface myDrawing { int originx { get; set; } int originy { get; set; } void Draw(object shape); } class Shape: myDrawing { int OriX; int OriY; public int originx { get{ return OriX; } set{ OriX = value; } } public int originy { get{ return OriY; } set{ OriY = value; } } public void Draw(object shape) { ... // 做要做的事 } // 类自身的方法 public void MoveShape(int newX, int newY) { ..... } } 数组 数组在 C# 比 C++ 要高级很多。数组分配于堆,所以是引用类型的。你不能访问数组边界外的元素。所以 C# 防止你引发那种 bug。同时也提供了迭代数组元素的帮助函数。foreach 是这样的迭代语句之一。C++ 和 C# 数组的语法差异在于: 方括号在类型后面而不是在变量名后面 创建元素使用 new 运算符 C# 支持一维、多维和交错数组(数组的数组) 例子: 复制内容到剪贴板 代码: int[] array = new int[10]; // int 型一维数组 for (int i = 0; i < array.Length; i++) array = i; int[,] array2 = new int[5,10]; // int 型二维数组 array2[1,2] = 5; int[,,] array3 = new int[5,10,5]; // int 型三维数组 array3[0,2,4] = 9; int[][] arrayOfarray = new int[2]; // int 型交错数组 - 数组的数组 arrayOfarray[0] = new int[4]; arrayOfarray[0] = new int[] {1,2,15}; 索引器 索引器用于书写一个可以通过使用 [] 像数组一样直接访问集合元素的方法。你所需要的只是指定待访问实例或元素的索引。索引器的语法和类属性语法相同,除了接受作为元素索引的输入参数外。 例子: 注意:CollectionBase 是用于建立集合的库类。List 是 CollectionBase 用于存放集合列表的受保护成员。 复制内容到剪贴板 代码: class Shapes: CollectionBase { public void add(Shape shp) { List.Add(shp); } //indexer public Shape this[int index] { get { return (Shape) List[index]; } set { List[index] = value ; } } } 装箱/拆箱 装箱的思想在 C# 是创新的。正如前面提到的,所有的数据类型,无论是内建的还是用户定义的,都是从 System 命名空间的基类 object 继承的。所以基础的或是原始的类型打包为一个对象称为装箱,相反的处理称为拆箱。 例子: 复制内容到剪贴板 代码: class Test { static void Main() { int myInt = 12; object obj = myInt ; // 装箱 int myInt2 = (int) obj; // 拆箱 } } 例程展示了装箱和拆箱两个过程。一个 int 可以被转换为对象,并且能够再次转换回 int。当某种类型的变量需要被转换为一个引用类型时,便会产生一个对象箱保存该。拆箱则完全相反。当某个对象箱被转换回其原类型时,该从箱拷贝至适当的存储空间。 函数参数 C# 的参数有三种类型: 1. 按传递/输入参数 2. 按引用传递/输入-输出参数 3. 输出参数 如果你有 COM 接口的思想,而且还是参数类型的,你会很容易理解 C# 的参数类型。 按传递/输入参数 参数的概念和 C++ 一样。传递的复制到了新的地方并传递给函数。 例子: 复制内容到剪贴板 代码: SetDay(5); ... void SetDay(int day) { .... } 按引用传递/输入-输出参数 C++ 的引用参数是通过指针或引用运算符 & 传递的。C# 的引用参数更不易出错。你可以传递一个引用地址,你传递一个输入的并通过函数得到一个输出的。因此引用参数也被称为输入-输出参数。 你不能将未初始化的引用参数传递给函数。C# 使用关键字 ref 指定引用参数。你同时还必须在传递参数给要求引用参数的函数时使用关键字 ref。 例子: 复制内容到剪贴板 代码: int a= 5; FunctionA(ref a); // 使用 ref,否则将引发编译时错误 Console.WriteLine(a); // 打印 20 复制内容到剪贴板 代码: void FunctionA(ref int Val) { int x= Val; Val = x* 4; } 输出参数 输出参数是只从函数返回的参数。输入不要求。C# 使用关键字 out 表示输出参数。 例子: 复制内容到剪贴板 代码: int Val; GetNodeValue(Val); 复制内容到剪贴板 代码: bool GetNodeValue(out int Val) { Val = value; return true; } 参数和数组的数量变化 C# 的数组使用关键字 params 进行传递。一个数组类型的参数必须总是函数最右边的参数。只有一个参数可以是数组类型。你可以传送任意数量的元素作为数组类型的参数。看了下面的例子你可以更好的理解: 注意:使用数组是 C# 提供用于可选或可变数量参数的唯一途径。 例子: 复制内容到剪贴板 代码: void Func(params int[] array) { Console.WriteLine("number of elements {0}", array.Length); } 复制内容到剪贴板 代码: Func(); // 打印 0 Func(5); // 打印 1 Func(7,9); // 打印 2 Func(new int[] {3,8,10}); // 打印 3 int[] array = new int[8] {1,3,4,5,5,6,7,5}; Func(array); // 打印 8 运算符与表达式 运算符和表达式跟 C++ 完全一致。然而同时也添加了一些新的有用的运算符。有些在这里进行了讨论。 is 运算符 is 运算符是用于检查操作数类型是否相等或可以转换。is 运算符特别适合用于多态的情形。is 运算符使用两个操作数,其结果是布尔。参考例子: 复制内容到剪贴板 代码: void function(object param) { if(param is ClassA) //做要做的事 else if(param is MyStruct) //做要做的事 } } as 运算符 as 运算符检查操作数的类型是否可转换或是相等(as 是由 is 运算符完成的),如果是,则处理结果是已转换或已装箱的对象(如果操作数可以装箱为目标类型,参考 装箱/拆箱)。如果对象不是可转换的或可装箱的,返回为 null。看看下面的例子以更好的理解这个概念。 复制内容到剪贴板 代码: Shape shp = new Shape(); Vehicle veh = shp as Vehicle; // 返回 null,类型不可转换 Circle cir = new Circle(); Shape shp = cir; Circle cir2 = shp as Circle; //将进行转换 object[] objects = new object[2]; objects[0] = "Aisha"; object[1] = new Shape(); string str; for(int i=0; i&< objects.Length; i++) { str = objects as string; if(str == null) Console.WriteLine("can not be converted"); else Console.WriteLine("{0}",str); } 复制内容到剪贴板 代码: Output: Aisha can not be converted 语句 除了些许附加的新语句和修改外,C# 的语句和 C++ 的基本一致。 以下是新的语句: foreach 用于迭代数组等集合。 例子: 复制内容到剪贴板 代码: foreach (string s in array) Console.WriteLine(s); lock 在线程使代码块称为重点部分。 (译注:lock 关键字将语句块标记为临界区,方法是获取给定对象的互斥锁,执行语句,然后释放该锁。lock 确保当一个线程位于代码的临界区时,另一个线程不进入临界区。如果其他线程试图进入锁定的代码,则它将一直等待(即被阻止),直到该对象被释放。) checked/unchecked 用于数字操作的溢出检查。 例子: 复制内容到剪贴板 代码: int x = Int32.MaxValue; x++; // 溢出检查 { x++; // 异常 } unchecked { x++; // 溢出 } 下面的语句已修改:(译注:原文如此,疑为作者笔误) Switch Switch 语句在 C# 修改过。 1.现在在执行一条 case 语句后,程序流不能跳至下一 case 语句。之前在 C++ 这是可以的。 例子: 复制内容到剪贴板 代码: int var = 100; switch (var) { case 100: Console.WriteLine(""); // 这里没有 break case 200: Console.WriteLine(""); break; } C++ 的输出: 复制内容到剪贴板 代码: 而在 C# 你将得到一个编译时错误: 复制内容到剪贴板 代码: error CS0163: Control cannot fall through from one case label ('case 100:') to another 2.然而你可以像在 C++ 一样这么用: 复制内容到剪贴板 代码: switch (var) { case 100: case 200: Console.WriteLine("100 or 200"); break; } 3.你还可以用常数变量作为 case : 例子: 复制内容到剪贴板 代码: const string WeekEnd = "Sunday"; const string WeekDay1 = "Monday"; .... string WeekDay = Console.ReadLine(); switch (WeekDay ) { case WeekEnd: Console.WriteLine("It's weekend!!"); break; case WeekDay1: Console.WriteLine("It's Monday"); break; } 委托 委托让我们可以把函数引用保存在变量。这就像在 C++ 使用 typedef 保存函数指针一样。 委托使用关键字 delegate 声明。看看这个例子,你就能理解什么是委托: 例子: 复制内容到剪贴板 代码: delegate int Operation(int val1, int val2); public int Add(int val1, int val2) { return val1 + val2; } public int Subtract (int val1, int val2) { return val1- val2; } public void Perform() { Operation Oper; Console.WriteLine("Enter + or - "); string optor = Console.ReadLine(); Console.WriteLine("Enter 2 operands"); string opnd1 = Console.ReadLine(); string opnd2 = Console.ReadLine(); int val1 = Convert.ToInt32 (opnd1); int val2 = Convert.ToInt32 (opnd2); if (optor == "+") Oper = new Operation(Add); else Oper = new Operation(Subtract); Console.WriteLine(" Result = {0}", Oper(val1, val2)); } 继承与多态 C# 只允许单一继承。多重继承可以通过接口达到。 例子: 复制内容到剪贴板 代码: class Parent{ } class Child : Parent 虚函数 虚函数在 C# 同样是用于实现多态的概念的,除了你要使用 override 关键字在子类实现虚函数外。父类使用同样的 virtual 关键字。每个重写虚函数的类都使用 override 关键字。(译注:作者所说的“同样”,“除……外”都是针对 C# 和 C++ 而言的) 复制内容到剪贴板 代码: class Shape { public virtual void Draw() { Console.WriteLine("Shape.Draw") ; } } class Rectangle : Shape { public override void Draw() { Console.WriteLine("Rectangle.Draw"); } } class Square : Rectangle { public override void Draw() { Console.WriteLine("Square.Draw"); } } class MainClass { static void Main(string[] args) { Shape[] shp = new Shape[3]; Rectangle rect = new Rectangle(); shp[0] = new Shape(); shp[1] = rect; shp[2] = new Square(); shp[0].Draw(); shp[1].Draw(); shp[2].Draw(); } } Output: Shape.Draw Rectangle.Draw Square.Draw 使用“new”隐藏父类函数 你可以隐藏基类的函数而在子类定义其新版本。关键字 new 用于声明新的版本。思考下面的例子,该例是上一例子的修改版本。注意输出,我用 关键字 new 替换了 Rectangle 类的关键字 override。 复制内容到剪贴板 代码: class Shape { public virtual void Draw() { Console.WriteLine("Shape.Draw") ; } } class Rectangle : Shape { public new void Draw() { Console.WriteLine("Rectangle.Draw"); } } class Square : Rectangle { //这里不用 override public new void Draw() { Console.WriteLine("Square.Draw"); } } class MainClass { static void Main(string[] args) { Console.WriteLine("Using Polymorphism:"); Shape[] shp = new Shape[3]; Rectangle rect = new Rectangle(); shp[0] = new Shape(); shp[1] = rect; shp[2] = new Square(); shp[0].Draw(); shp[1].Draw(); shp[2].Draw(); Console.WriteLine("Using without Polymorphism:"); rect.Draw(); Square sqr = new Square(); sqr.Draw(); } } Output: Using Polymorphism Shape.Draw Shape.Draw Shape.Draw Using without Polymorphism: Rectangle.Draw Square.Draw 多态性认为 Rectangle 类的 Draw 方法是和 Shape 类的 Draw 方法不同的另一个方法,而不是认为是其多态实现。所以为了防止父类和子类间的命名冲突,我们只有使用 new 修饰符。 注意:你不能在一个类使用一个方法的两个版本,一个用 new 修饰符,另一个用 override 或 virtual。就像在上面的例子,我不能在 Rectangle 类增加另一个名为 Draw 的方法,因为它是一个 virtual 或 override 的方法。同样在 Square 类,我也不能重写 Shape 类的虚方法 Draw。 调用基类成员 如果子类的数据成员和基类的有同样的名字,为了避免命名冲突,基类成员和函数使用 base 关键字进行访问。看看下面的例子,基类构造函数是如何调用的,而数据成员又是如何使用的。 复制内容到剪贴板 代码: public Child(int val) :base(val) { myVar = 5; base.myVar; } OR public Child(int val) { base(val); myVar = 5 ; base.myVar; } 前景展望 本文仅仅是作为 C# 语言的一个快速浏览,以便你可以熟悉该语言的一些特性。尽管我尝试用实例以一种简短而全面的方式讨论了 C# 几乎所有的主要概念,但我认为还是有很多内容需要增加和讨论的。 以后,我会增加更多的没有讨论过的命令和概念,包括事件等。我还想给初学者写一下怎么用 C# 进行 Windows 编程。 参考文献: 我们都知道的 MSDN Tom Archer 著,Inside C# Eric Gunnerson 著,A Programmer's Introduction to C# Karli Watson 著,Beginning C# O'Reilly(奥莱利出版),Programming C# 修改: 2003年6月12日:按引用传递/输入-输出参数一节增加了 ref 关键字 2003年6月20日:为可选参数增加了一条注意事项,纠正了交错数组例子运算符的笔误 许可 本文及其任何关联的源代码和文件均以 The Code Project Open License (CPOL)执行。(译注:代码计划网站公开许可)
第Ⅰ部分 C#语言 第1章 C#简介 3 1.1 .net framework的含义 3 1.1.1 .net framework的内容 4 1.1.2 使用.net framework编写应用程序 4 1.2 C#的含义 7 1.2.1 用C#能编写什么样的应用程序 7 1.2.2 本书的C# 8 1.3 visual studio 2010 8 1.3.1 visual studio 2010 express产品 9 1.3.2 解决方案 9 1.4 小结 9 1.5 本章要点 10 第2章 编写C#程序 11 2.1 开发环境 12 2.1.1 visual studio 2010 12 2.1.2 visual C# 2010 express edition 14 2.2 控制台应用程序 15 2.2.1 solution explorer 19 2.2.2 properties窗口 20 2.2.3 error list窗口 20 2.3 windows forms应用程序 21 2.4 小结 25 2.5 本章要点 25 第3章 变量和表达式 27 3.1 C#的基本语法 27 3.2 C#控制台应用程序的基本结构 30 3.3 变量 31 3.3.1 简单类型 31 3.3.2 变量的命名 35 3.3.3 字面 36 3.3.4 变量的声明和 38 3.4 表达式 39 3.4.1 数学运算符 39 3.4.2 运算符 43 3.4.3 运算符的优先级 44 3.4.4 名称空间 45 3.5 小结 47 3.6 练习 48 3.7 本章要点 49 第4章 流程控制 51 4.1 布尔逻辑 51 4.1.1 布尔运算符 54 4.1.2 按位运算符 55 4.1.3 运算符优先级的更新 59 4.2 goto语句 60 4.3 分支 61 4.3.1 三元运算符 61 4.3.2 if语句 61 4.3.3 switCh语句 65 4.4 循环 68 4.4.1 do循环 68 4.4.2 while循环 71 4.4.3 for循环 73 4.4.4 循环的断 77 4.4.5 无限循环 78 4.5 小结 78 4.6 练习 79 4.7 本章要点 79 第5章 变量的更多内容 81 5.1 类型转换 81 5.1.1 隐式转换 82 5.1.2 显式转换 83 5.1.3 使用Convert命令进行显式转换 86 5.2 复杂的变量类型 89 5.2.1 枚举 89 5.2.2 结构 93 5.2.3 数组 96 5.3 字符串的处理 102 5.4 小结 106 5.5 练习 107 5.6 本章要点 108 第6章 函数 109 6.1 定义和使用函数 110 6.1.1 返回 111 6.1.2 参数 113 6.2 变量的作用域 120 6.2.1 其他结构变量的作用域 122 6.2.2 参数和返回与全局数据 124 6.3 main( )函数 125 6.4 结构函数 128 6.5 函数的重载 128 6.6 委托 130 6.7 小结 133 6.8 练习 133 6.9 本章要点 134 第7章 调试和错误处理 135 7.1 vs和vce的调试 135 7.1.1 非断(正常)模式下的调试 136 7.1.2 断模式下的调试 144 7.2 错误处理 152 7.2.1 try...catch...finally 153 7.2.2 列出和配置异常 157 7.2.3 异常处理的注意事项 158 7.3 小结 159 7.4 练习 159 7.5 本章要点 159 第8章 面向对象编程简介 161 8.1 面向对象编程的含义 162 8.1.1 对象的含义 162 8.1.2 一切皆对象 165 8.1.3 对象的生命周期 165 8.1.4 静态和实例类成员 166 8.2 oop技术 167 8.2.1 接口 167 8.2.2 继承 169 8.2.3 多态性 171 8.2.4 对象之间的关系 172 8.2.5 运算符重载 173 8.2.6 事件 174 8.2.7 引用类型和类型 174 8.3 windows应用程序的oop 175 8.4 小结 177 8.5 练习 177 8.6 本章要点 178 第9章 定义类 179 9.1 C#的类定义 179 9.2 system.objeCt 184 9.3 构造函数和析构函数 185 9.4 vs和vCe的oop工具 190 9.4.1 Class view窗口 190 9.4.2 对象浏览器 192 9.4.3 添加类 193 9.4.4 类图 194 9.5 类库项目 196 9.6 接口和抽象类 199 9.7 结构类型 201 9.8 浅度和深度复制 203 9.9 小结 203 9.10 练习 204 9.11 本章要点 204 第10章 定义类成员 205 10.1 成员定义 205 10.1.1 定义字段 206 10.1.2 定义方法 206 10.1.3 定义属性 207 10.1.4 在类图添加成员 212 10.1.5 重构成员 215 10.1.6 自动属性 216 10.2 类成员的其他议题 217 10.2.1 隐藏基类方法 217 10.2.2 调用重写或隐藏的基类方法 219 10.2.3 嵌套的类型定义 220 10.3 接口的实现 220 10.4 部分类定义 224 10.5 部分方法定义 225 10.6 示例应用程序 227 10.6.1 规划应用程序 227 10.6.2 编写类库 228 10.6.3 类库的客户应用程序 235 10.7 call hierarchy窗口 236 10.8 小结 237 10.9 练习 237 10.10 本章要点 238 第11章 集合、比较和转换 239 11.1 集合 239 11.1.1 使用集合 240 11.1.2 定义集合 246 11.1.3 索引符 247 11.1.4 给Cardlib添加Cards集合 250 11.1.5 关键字集合和idiCtionary 252 11.1.6 迭代器 254 11.1.7 深复制 259 11.1.8 给Cardlib添加深复制 261 11.2 比较 263 11.2.1 类型比较 263 11.2.2 比较 268 11.3 转换 283 11.3.1 重载转换运算符 284 11.3.2 as运算符 285 11.4 小结 286 11.5 练习 286 11.6 本章要点 287 第12章 泛型 289 12.1 泛型的概念 289 12.2 使用泛型 291 12.2.1 可空类型 291 12.2.2 system.ColleCtions.generiC名称空间 297 12.3 定义泛型类型 307 12.3.1 定义泛型类 308 12.3.2 定义泛型接口 319 12.3.3 定义泛型方法 319 12.3.4 定义泛型委托 321 12.4 变体 321 12.4.1 协变 322 12.4.2 抗变 323 12.5 小结 324 12.6 练习 324 12.7 本章要点 325 第13章 其他oop技术 327 13.1 ::运算符和全局名称空间限定符 327 13.2 定制异常 329 13.3 事件 331 13.3.1 事件的含义 331 13.3.2 处理事件 332 13.3.3 定义事件 334 13.4 扩展和使用Cardlib 343 13.5 小结 351 13.6 练习 352 13.7 本章要点 352 第14章 C#语言的改进 353 14.1 初始化器 353 14.1.1 对象初始化器 354 14.1.2 集合初始化器 356 14.2 类型推理 359 14.3 匿名类型 360 14.4 动态查找 364 14.4.1 dynamiC类型 365 14.4.2 idynamiCmetaobjeCtprovider 369 14.5 高级方法参数 369 14.5.1 可选参数 369 14.5.2 命名参数 371 14.5.3 命名参数和可选参数的规则 375 14.6 扩展方法 375 14.7 lambda表达式 379 14.7.1 复习匿名方法 379 14.7.2 把lambda表达式用于匿名方法 380 14.7.3 lambda表达式的参数 383 14.7.4 lambda表达式的语句体 384 14.7.5 lambda表达式用作委托和表达式树 385 14.7.6 lambda表达式和集合 386 14.8 小结 388 14.9 练习 389 14.10 本章要点 390 第Ⅱ部分 windows 编 程 第15章 windows编程基础 393 15.1 控件 393 15.1.1 属性 394 15.1.2 控件的定位、停靠和对齐 395 15.1.3 anchor和dock属性 395 15.1.4 事件 396 15.2 button控件 398 15.2.1 button控件的属性 398 15.2.2 button控件的事件 398 15.2.3 添加事件处理程序 399 15.3 label和linklabel控件 400 15.4 textbox控件 401 15.4.1 textbox控件的属性 401 15.4.2 textbox控件的事件 402 15.4.3 添加事件处理程序 404 15.5 radiobutton和CheCkbox控件 407 15.5.1 radiobutton控件的属性 408 15.5.2 radiobutton控件的事件 408 15.5.3 CheCkbox控件的属性 408 15.5.4 CheCkbox控件的事件 409 15.5.5 groupbox控件 409 15.6 riChtextbox控件 412 15.6.1 riChtextbox控件的属性 412 15.6.2 riChtextbox控件的事件 413 15.7 listbox和CheCkedlistbox控件 418 15.7.1 listbox控件的属性 418 15.7.2 listbox控件的方法 419 15.7.3 listbox控件的事件 420 15.8 listview控件 422 15.8.1 listview控件的属性 422 15.8.2 listview控件的方法 424 15.8.3 listview控件的事件 424 15.8.4 listviewitem 425 15.8.5 Columnheader 425 15.8.6 imagelist控件 425 15.9 tabControl控件 431 15.9.1 tabControl控件的属性 432 15.9.2 使用tabControl控件 432 15.10 小结 434 15.11 练习 434 15.12 本章要点 434 第16章 windows窗体的高级功能 435 第17章 部署windows应用程序 465 第Ⅲ部分 web 编 程 第18章 asp-net web编程 503 第19章 web服务 557 第20章 部署web应用程序 581 第Ⅳ部分 数 据 访 问 第21章 文件系统数据 597 第22章 xml 633 第23章 linq简介 657 第24章 应用linq 695 第Ⅴ部分 其 他 技 术 第25章 windows presentation 第26章 windows Communication Foundation 787 第27章 windows workflow foundation 819 附录A 习题答案 839
第1章 什么是Java程序设计语言 1 1.1 Java语言诞生背景 1 1.2 Java语言的特点 1 1.2.1 可移植性(universality) 1 1.2.2 安全性(security) 1 1.2.3 Java Virtual Machine(JVM) 2 1.2.4 面向对象的程序设计语言 2 1.2.5 线程(thread) 2 1.2.6 垃圾回收机制(garbage collection) 2 1.3 安装Java程序开发工具(JDK1.5) 2 1.3.1 安装JAVA 2 Standard Edition 1.5.0 3 1.3.2 安装开发文档及最终完成 5 1.3.3 Java开发工具 6 1.4 Java程序开发过程 7 1.5 运行第一个Java程序 7 1.6 巩固练习 8 第2章 理解对象与类 9 2.1 什么是对象 9 2.2 什么是类 9 2.3 HelloJava示例的分析 11 2.4 巩固练习 12 第3章 Java语言的基本语法 13 3.1 代码编写规则 13 3.2 注释 13 3.3 标识符 14 3.4 变量和常量 15 3.5 数据类型 16 3.5.1 基本数据类型 16 3.5.2 对象类型 21 3.6 类型转换 21 3.6.1 自动类型转换 22 3.6.2 强制类型转换 24 3.6.3 String型对象与基本数据类型间的运算 25 3.7 运算符 25 3.7.1 逻辑非(!) 26 3.7.2 位非运算符(~) 26 3.7.3 符号运算符(+、-) 27 3.7.4 增减运算符(++、--) 27 3.7.5 算术运算符(+、-、*、/) 29 3.7.6 位移(shift)运算符(、、) 29 3.7.7 关系运算符(、、=、=、==、!=) 31 3.7.8 快速逻辑与(&&)和快速逻辑或(||) 32 3.7.9 位运算符:位与(&)、位或(|)、位异或(^) 34 3.7.10 三目运算符(?:) 35 3.7.11 运算符 36 3.7.12 对象运算符(instanceof) 37 3.8 巩固练习 37 第4章 程序流程控制语句 39 4.1 if语句 39 4.1.1 if语句格式1 39 4.1.2 if语句格式2 40 4.1.3 if语句格式3 41 4.2 switch语句 44 4.3 for语句 46 4.3.1 break语句 49 4.3.2 continue语句 49 4.3.3 多重for循环语句 50 4.3.4 多重for循环语句的break与continue 52 4.4 while语句 55 4.5 do-while语句 57 4.6 巩固练习 57 第5章 类与对象 59 5.1 类的定义与对象的创建 59 5.2 引用 61 5.3 成员方法 62 5.3.1 void返回类型 64 5.3.2 无参方法 65 5.3.3 多参方法 65 5.4 局部变量和成员变量 67 5.5 this引用 68 5.6 静态变量与静态方法 70 5.7 成员与静态方法的关系 71 5.8 包与导入 72 5.9 访问控制符 74 5.10 重载 77 5.11 构造函数 79 5.12 类的初始化 83 5.12.1 静态块 84 5.12.2 实例块 84 5.13 巩固练习 85 第6章 数组 86 6.1 基本数据类型数组 86 6.2 一维数组的初始化 88 6.3 对象数组 88 6.4 二维数组 91 6.5 三维数组 95 6.6 巩固练习 97 第7章 对象与方法 99 7.1 对象的创建与销毁 99 7.2 传递调用 102 7.3 引用传递调用 103 7.4 获取命令行参数 105 7.5 返回对象引用 106 7.6 返回新对象 107 7.7 自引用 108 7.8 递归调用 111 7.9 巩固练习 114 第8章 继承 117 8.1 继承的概念 117 8.2 子类对象的创建 118 8.3 this与super 119 8.4 继承的访问控制符 123 8.5 覆盖 124 8.6 多态 126 8.7 引用的范围 127 8.8 引用变量的类型转换 128 8.9 Object类 129 8.10 “==”与equals() 130 8.11 Object型引用变量 132 8.12 类的层级图 134 8.13 巩固练习 135 第9章 抽象类与接口 136 9.1 抽象类 136 9.2 final关键字 138 9.3 接口 139 9.4 Cloneable 接口 143 9.5 Enumeration接口 144 9.6 巩固练习 145

17,740

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 .NET Framework
社区管理员
  • .NET Framework社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧