以文本方式查看主题

-  中文XML论坛 - 专业的XML技术讨论区  (http://bbs.xml.org.cn/index.asp)
--  『 Dot NET,C#,ASP,VB 』  (http://bbs.xml.org.cn/list.asp?boardid=43)
----  初探c#(六 至 十)  (http://bbs.xml.org.cn/dispbbs.asp?boardid=43&rootid=&id=75965)


--  作者:卷积内核
--  发布时间:7/10/2009 4:11:00 PM

--  初探c#(六 至 十)
初探c#(六)统一系统类型
c#独创了一种类型——统一系统类型(为了这个累刑,我头疼死了。谁有更好的名字,请务必告诉我)。总之,所有的其他类型,包括值和引用,都可以被当作统一系统类型来对待。从概念上说,所有的类型都从它派生。这样,其他的类型就可以使用统一系统类型的属性和方法。包括一些“简单”类型,如:int。还是给个例子吧:

*/
using System;
class Test
{
static void Main() {
Console.WriteLine(3.ToString());
}
}
/*

  “3.ToString()”调用了object的“ToString()”方法。相信学过c/c++的朋友都知道要输出一个数字有多麻烦,现在就省事了。再看一个:*/

class Test
{
static void Main() {
int i = 123;
object o = i; // boxing
int j = (int) o; // unboxing
}
}
/*

  这个像帽子戏法的例子中,从“int”转换成“object”,又转换回来。这样一来,在值和引用之间就架起了一座桥梁。

QQ病毒 腾讯QQ空间代码专题 PPT教程专题 ADSL应用面面俱到 Fireworks教程专题 计算机和网络技术基础知识 校园网专题 网吧技术专题 这样有什么用呢。即兴举一个常见的例子...就min把。在c/c++中:*/

// c/c++ code

void min(int i, int j)
{
return ((i < j) ? i : j);
}

/* 如果比较的不是int,或者说可能是int,也可能是float、double呢?可以这样:*/

template
T min (T i, T j)
{
return ((i < j) ? i : j)
}

/* 用c#可以:*/
void swap (object a, object b)
{
return ((i < j) ? i : j);
}

/*
  我想大家一定看出来第二个例子要比较一个int和一个float的话,还需要一些转换,而第三个例子就可以比较所有的变量!这个灵活度简直太大了。所以,我私以为,大家使用时一定要小心!
  它在比较一个int和一个class的时候决不会报错的。呵呵,我发现我的翻译总是越跑越远,总是扣不住原文。篡改甚多,敬请原谅!


--  作者:卷积内核
--  发布时间:7/10/2009 4:12:00 PM

--  
初探c#(七)语句(Statements)
c#借用了c/c++大多数的语句方法,不过仍然有些值得注意的地方。还有些地方是有所改动的。在这里,我只提一些c#特有的东东。

1.7.10 “foreach”语句

  “foreach”语句列举一个集合内的所有元素,并对这些元素执行一系列的操作。还是看看例子吧:*/

using System;
using System.Collections;
class Test
{
static void WriteList(ArrayList list) {
foreach (object o in list)
{
int i = (int) o;//如果是for语句,这里一定会报错!
Console.WriteLine(0);
Console.WriteLine(++i);
}
}
static void Main() {
ArrayList list = new ArrayList();
for (int i = 0; i < 10; i++)
list.Add(i);
WriteList(list);
}
}

/*这个例子用“foreach”扫描了整个“list”,并把“list”中所有的元素打印出来。有时候还是挺方便的。

1.7.15 安全检查开关(The checked and unchecked statements)

  “checked”和“unchecked”语句用来控制数学运算和完整类型转换的检查工作。“checked”检查它作用的域中可能出现的违例,并抛出一个异常;而“unchecked”则阻止所有的检查。举个例子:*/

using System;
class Test
{
static int x = 1000000;
static int y = 1000000;
static int F() {
checked {return (x * y);} // 抛出 OverflowException
}
static int G() {
unchecked {return (x * y);} // 返回 -727379968
}
static int H() {
return x * y; // 缺省状态。
}
static void Main() {
F(); //可以注销掉此行试试。
Console.WriteLine(G());
Console.WriteLine(H());
}
}

/*
在编译过程中不会有任何错误出现。因为“checked”和“unchecked”只在运行时才起作用。值得一说的是H()。它的缺省状态和编译器当前的缺省溢出检查的状态有关。但返回的结果肯定和F()或G()中的任一个相同。


QQ病毒 腾讯QQ空间代码专题 PPT教程专题 ADSL应用面面俱到 Fireworks教程专题 计算机和网络技术基础知识 校园网专题 网吧技术专题 再看一个例子:*/

using System;
class Test
{
const int x = 1000000;
const int y = 1000000;
static int F() {
checked {return (x * y);} // 编译器警告(Compile warning):溢出(overflow)
}
static int G() {
unchecked {return (x * y);} // 返回 -727379968
}
static int H() {
return x * y; // 编译器警告(Compile warning):溢出(overflow)
}
static void Main() {
Console.WriteLine(F()); //可以注销掉此行试试。
Console.WriteLine(G());
Console.WriteLine(H()); //可以注销掉此行试试。
}
}

/* 当F()和H()求值的时候,就会引起一个编译警告。而在G()中,因为有了“unchecked”,屏蔽了这个警
告。要注意的是“checked”和“unchecked”都不能对函数的返回值进行操作!比如:*/

class Test
{
static int Multiply(int x, int y) {
return x * y;
}
static int F() {
checked{ return Multiply(1000000, 1000000); } // 与 return Multiply(1000000, 1000000);
} // 有相同的效果。
}

/* 其实大家稍微想一下知道为什么m$没有这么做!对这个内容的讨论超出本文的范围和俺的能力之外哦。

  在c#中,所有的十六进制数都是uint。如果用强制类型转换会引起编译器报错。用“unchecked”则可以跳过这个机制,把uint的十六进制数转化为int。如:*/

class Test
{
public const int AllBits = unchecked((int)0xFFFFFFFF);
public const int HighBit = unchecked((int)0x80000000);
}

/* 上例所有的常数都是uint,而且超过了int的范围,没有“unchecked”,这种转换会引发一个编译器错误。注意:上面用的是“unchecked”操作符。不是语句。不过它们之间除了一个用“()”,另一个用“{}”以外,几乎一样。BTW,“checked”同样。

1.7.16 “lock”语句(The lock statement)

“lock”获得一个相互排斥的对象锁定。(俺查过一些资料,但都没有清晰说明,暂不介绍)


--  作者:卷积内核
--  发布时间:7/10/2009 4:13:00 PM

--  
初探c#(八)类(Classes)
类用于定义一个新的引用类型。c#不支持多重继承,但支持一个类多重界面(“interfaces”)。
  类的成员包括常量、位域、方法、属性、索引(indexers)、事件、操作符、构造器、析构器和嵌套类型声明。(一口气说这么多,呼——)
  对类中得所有成员有五种访问权限:

· “public” 可以被所有代码访问;
· “protected” 只可以被继承类访问;
· “internal” 只可以被同一个项目的代码访问;
· “protected internal”只可以被同一个项目的代码或继承类访问;
· “private” 只可以被本类中的代码访问。
缺省状态是“private”。


--  作者:卷积内核
--  发布时间:7/10/2009 4:13:00 PM

--  
初探c#(九)结构(Structs)
结构和类又非常多的相似之处,如结构可以实现界面,和可以拥有和类一样的成员。结构与类也有一些重要的区别:结构是值类型,而不是引用类型,所以不支持继承!结构被存在堆栈中或者是内联。结构在精心下可以提高存储效能。例如,定义一个与类有着相同信息的结构可以大大地减少存储空间。在下例中,程序创建并初始化100个points。在类“Point”中需要分配101个独立的对象(object)。*/

class Point
{
public int x, y;
public Point() {
x = 0;
y = 0;
}
public Point(int x, int y) {
this.x = x;
this.y = y;
}
}
class Test
{
static void Main() {
Point[] points = new Point[100];
for (int i = 0; i < 100; i++)
points[i] = new Point(i, i*i);
}
}
/*

如果“Point”被作为一个结构,就可以这样啦:*/

struct Point
{
public int x, y;
public Point(int x, int y) {
this.x = x;
this.y = y;
}
}
/*

  因为Point在内联中实例化,所以得到了优化。当然,错误运用的只会适得其反。比如,当我们传递结构的时候就会比传递类要慢。因为结构的传递是拷贝值,类是引用值的地址。数据量越大差距就越明显。

  所以“There is no substitute for careful data structure and algorithm design.”(实在是不想译了 ^_^ )。

1.10 界面(Interfaces)

  界面用来定义一种程序的契约。有了这个契约,就可以跑开编程语言的限制了(理论上)。而实现界面的
类或者结构要与界面的定义严格一致。界面可以包含以下成员:方法、属性、索引和事件。例子:*/

interface IExample
{
string this[int index] { get; set; }
event EventHandler E;
void F(int value);
string P { get; set; }
}
public delegate void EventHandler(object sender, Event e);
/*

  例子中的界面包含一个索引、一个事件E、一个方法F和一个属性P。
  界面可以支持多重继承。就像在下例中,界面“IComboBox”同时从“ITextBox”和“IListBox”继承。

*/
interface IControl
{
void Paint();
}
interface ITextBox: IControl
{
void SetText(string text);
}
interface IListBox: IControl
{
void SetItems(string[] items);
}
interface IComboBox: ITextBox, IListBox {}
/*

  类和结构可以多重实例化界面。 就像在下例中,类“EditBox”继承了类“Control”,同时从“IDataBound”和“IControl”继承。
*/

interface IDataBound
{
void Bind(Binder b);
}
public class EditBox: Control, IControl, IDataBound
{
public void Paint();
public void Bind(Binder b) {...}
}
/*

  在上面的代码中,“Paint”方法从“IControl”界面而来;“Bind”方法从“IDataBound”界面而来,都以“public”的身份在“EditBox”类中实现。


--  作者:卷积内核
--  发布时间:7/10/2009 4:14:00 PM

--  
初探c#(十)界面(Interfaces)
界面用来定义一种程序的契约。有了这个契约,就可以跑开编程语言的限制了(理论上)。而实现界面的
类或者结构要与界面的定义严格一致。界面可以包含以下成员:方法、属性、索引和事件。例子:*/

interface IExample
{
string this[int index] { get; set; }
event EventHandler E;
void F(int value);
string P { get; set; }
}
public delegate void EventHandler(object sender, Event e);
/*

  例子中的界面包含一个索引、一个事件E、一个方法F和一个属性P。
  界面可以支持多重继承。就像在下例中,界面“IComboBox”同时从“ITextBox”和“IListBox”继承。

*/
interface IControl
{
void Paint();
}
interface ITextBox: IControl
{
void SetText(string text);
}
interface IListBox: IControl
{
void SetItems(string[] items);
}
interface IComboBox: ITextBox, IListBox {}
/*

  类和结构可以多重实例化界面。 就像在下例中,类“EditBox”继承了类“Control”,同时从“IDataBound”和“IControl”继承。
*/

interface IDataBound
{
void Bind(Binder b);
}
public class EditBox: Control, IControl, IDataBound
{
public void Paint();
public void Bind(Binder b) {...}
}
/*

  在上面的代码中,“Paint”方法从“IControl”界面而来;“Bind”方法从“IDataBound”界面而来,都以“public”的身份在“EditBox”类中实现。


W 3 C h i n a ( since 2003 ) 旗 下 站 点
苏ICP备05006046号《全国人大常委会关于维护互联网安全的决定》《计算机信息网络国际联网安全保护管理办法》
3,757.813ms