posts - 14,  comments - 20,  trackbacks - 0
公告
  2009年3月18日
 
预定义类型同时含了预定义的转化行为。比如,int和long之间存在预定义的转化。C#区分这两种类型的转化:隐式转化和显示转化。隐式转化指的是安全的、不需要仔细地指出来的转化。比如int到long的转化就是隐式转化。这种转化总是成功执行,不会造成信息的丢失(译注:此处指的是精度损失)。下面的例子:
 1 using System;
 2 class
 Test
 3 
{
 4  static void
 Main()
 5 
 {
 6  int intValue = 123
;
 7  long longValue =
 intValue;
 8  Console.WriteLine("{0}, {1}"
, intValue, longValue);
 9 
 }
10 }
隐式地将一个int类型的变量转化成long类型的变量(译注:intValue本身的类型始终是int,不会变)。
相反的,显示转化需要一个转化表达式,如:
 1 using System;
 2 class
 Test
 3 
{
 4 static void
 Main()
 5 
 {
 6 long longValue =
 Int64.MaxValue;
 7 int intValue = (int
) longValue;
 8 Console.WriteLine("(int) {0} = {1}"
, longValue, intValue);
 9 
}
10 }
例子中将long显示转化成int.输出是
(int) 9223372036854775807 = -1
因为溢出了。转化表达式允许执行显示和隐式的转化。

posted @ 2009-03-18 17:17 apple123 阅读(81) 评论(0) 编辑
 

 

C#提供了一些预定义类型,大部分是C、C++程序员熟悉的。预定义的引用类型是object和string。object类型是所有类型的最终基类。string类代表了Unicode字符串。string对象的值是不可变的。

预定义的值类型包括有符号和无符号的整型,浮点型,以及bool、char和decimal。有符号的整型有sbyte,short,int,long;无符号的整型有byte,unshort,uint,ulong;浮点型包括float,double。

bool用来表示布尔值:只能是true或false。bool类型使得书写自描述的代码更加容易,并且消除了这种C++代码中常见的错误:在该用"=="的地方却用了"="。在c#中,代码:

 

int i = …; 

F(i); 

if (i = 0// Bug: the test should be (i == 0) 


G(); 

 

会导致编译错误,因为表达式i=0的值是int类型的,但是if语句要求使用bool类型的表达式。

char类型用来表示Unicode编码序列,char类型的变量表示一个16比特的Unicode编码序列。

decimal类型在浮点运算导致的舍入错误变得不可接受时使用,通常包括在金融计算如税务计算、货币兑换。decimal提供至少28位的有效数字。

下面的这个表格列出了这些预定义类型,以及给出了它们的常量值。

 

类型

说明

例子

object  

所有其他类型的最终基类

object o = null;

string String type; 

 

 

一个string是一个Unicode编码序列

string s = "hello";

sbyte 

8比特有符号的整型

sbyte val = 12;

short 

16比特有符号整型

 short val = 12;


int  

32比特有符号整型

int val = 12;

long  

64比特有符号整型

long val1 = 12;

long val2 = 34L;

byte

 8比特无符号整型

byte val1 = 12;


ushort 

16比特无符号整型

 ushort val1 = 12;

uint

32比特无符号整型

 uint val1 = 12;

uint val2 = 34U;

ulong  

64比特无符号整型

ulong val1 = 12;

ulong val2 = 34U;

ulong val3 = 56L;

ulong val4 = 78UL;

float 

  

 

 

单精度浮点型

float val = 1.23F;

double

双精度浮点型

double val1 = 1.23;

double val2 = 4.56D;

bool

比尔类型,值只能为true或false

bool val1 = true;

bool val2 = false;

char 

字符类型,表示Unicode编码序列

 

char val = 'h';

decimal

精确的小数类型,至少28个有效数字

decimal val = 1.23M;

每一个预定义的类型都对应一个缩写的系统提供类型。比如,关键字代表System.Int32结构类型。作为一种编码风格,一般用关键字代替完整的系统类型名。

预定义类型在某些方面进行了特殊的处理,但和其他的结构类型差不多。运算符重载允许开发人员定义新的、用法跟预定义类型类似结构类型。比如说,一个Digit结构类型可以支持所有预定义类型支持的运算符,并且能够定义预定义类型到Digit类型的转化。

预定义类型默认使用了运算符重载。比如,比较运算符==和!=对于不同的预定义类型来说有不同的意思:

两个int类型的表达式包含相同的整型值,那么它们是相等的

两个object类型的表达式引用相同的对象,或二者都是null,那么它们是相等的。

两个string类型的表达式所引用的字符串长度相等并且每个位置对应的字符相同,或二者都为null,那么他们相等。

请看例子:

 

using System;

class
 Test 



static void
 Main() { 

string s = "Test"


string t = string
.Copy(s); 

Console.WriteLine(s 
==
 t); 

Console.WriteLine((
object)s == (object
)t); 





输出是:

True

False

原因是第一个比较运算的对象是两个string类型的表达式,而第二个比较运算的对象是两个object类型的表达式。

(注意:标准库会给布尔类型生成一个字符串表示,如上面的System.Console.WriteLine,输出是"True"和"False",而标准的C#布尔值的两个常量写作true和false)。

 

posted @ 2009-03-18 16:49 apple123 阅读(916) 评论(0) 编辑

 

C#支持两种类型:值类型和引用类型。值类型包括简单类型(如char,int,和float),枚举类型,以及结构类型。引用类型有类、接口、委托和数组类型。

值类型和引用类型的区别在于:值类型变量直接保存着它的值,而引用变量保存着对象(译注:对象里保存着值)的引用。对于引用类型来说,
两个引用类型的变量可以可以指向同一个对象,因此,会出现在一个引用变量上操作它所指向的对象,却影响了其他的某个引用变量所指向的对象。

请看例子:

using System;
struct Struct1
{
public int Value;
}
class Class1
{
public int Value = 0;
}
class Test
{
static void Main() {
Struct1 val1 
= new Struct1();
Struct1 val2 
= val1;
val2.Value 
= 123;
Class1 ref1 
= new Class1();
Class1 ref2 
= ref1;
ref2.Value 
= 123;
Console.WriteLine(
"Values: {0}, {1}", val1.Value, val2.Value);
Console.WriteLine(
"Refs: {0}, {1}", ref1.Value, ref2.Value);
}
}
这个例子显示了两种类型的区别,程序产生的输出是:
Values: 0, 123
Refs: 123, 123
给局部变量val2的一个成员赋值,不会影响局部变量val1,因为这两个局部变量都是值类型的,并且每个值类型的变量都有自己的存储空间。与此相反,赋值操作ref2.Value = 123;影响了ref1和ref2同时指向的那个对象。
注意下面两条语句:
Console.WriteLine("Values: {0}, {1}", val1.Value, val2.Value);
Console.WriteLine("Refs: {0}, {1}", ref1.Value, ref2.Value);
它们展示了Console.WriteLine方法的字符串格式化的功能,用到了可变数量的参数。第一个参数是一个字符串,它里面可以包含数字占位符如{0}和{1},每一个占位符指向接下来的某个参数,{0}指向该方法的第二个参数,{1}指向第三个参数,以此类推。在向控制台输出以前,每一个占位符都被相应的变量的格式化结果代替(译注:占位符里还可以带有格式化的指令如{0:C}表示将数字转换为表示货币金额的字符串)。
我们可以定义新的enum和struct值类型,也可以定义class、interface、delegate引用类型。请看例子:

using System;
public enum Color
{
Red, Blue, Green
}
public struct Point
{
public int x, y;
}
public interface IBase
{
void F();
}
public interface IDerived: IBase
{
void G();
}
public class A
{
protected virtual void H() {
Console.WriteLine(
"A.H");
}
}
public class B: A, IDerived
{
public void F() {
Console.WriteLine(
"B.F, implementation of IDerived.F");
}
public void G() {
Console.WriteLine(
"B.G, implementation of IDerived.G");
}
override protected void H() {
Console.WriteLine(
"B.H, override of A.H");
}
}
public delegate void EmptyDelegate();

例子给出了每一个类型的定义。接下来会详细介绍这些类型的定义。



posted @ 2009-03-18 14:38 apple123 阅读(695) 评论(0) 编辑
这份国际标准来自于惠普、英特尔、微软提交的一门被称作C#的语言,C#语言是在微软开发出来的。这门语言是由Anders Hejlsberg, Scott Wiltamuth, and Peter Golde设计的。
c#规范的第一份广泛使用的实现是由微软在2000年6月份发布的,是其.Net框架最初发布的一部分。ECMA(欧洲电脑厂商协会)39号技术委员会的2号任务组负责对C#进行标准化,成立于2000年9月。
另外一个任务组3,在同一时间成立,目标是实现C#类库和执行环境(即公共语言基础架构CLI)的标准化,CLI建立在.Net框架的一个子集的基础上。
虽然微软的C#实现依赖于CLI提供的类库和运行环境支持,其他人的c#实现可以不用这样(不用实现像微软的.Net框架那么多特征),只要满足本C#标准中提到的CLI最小子集(见附录D)的要求就可以了。
C#语言在不断改进,其最初的设计如下:
  1. C#是一门简单的、现代的、通用的、面向对象的编程语言。
  2. C#及其实现,应该支持软件工程的原则,如强类型检查、数组边界检查、检查未初始化的变量的使用以及垃圾回收。软件的健壮、持久耐用以及编程人员的效率是着重考虑的。
  3. C#应该适合开发分布式应用组件。
  4. 源代码的移植很重要,这意味着程序员从其他语言转到C#很重要,特别是那些熟悉C和C++的程序员。
  5. 国际化的支持很重要。
  6. C#语言应用程序应该同时适合主机和嵌入式环境,从规模非常大的、使用复杂操作系统的运行环境,到非常小的、拥有特定功能的运行环境。
  7. 虽然C#设计成节约内存和处理器时间,但不会有意地去跟C语言或者汇编语言在性能上、程序大小方面直接竞争。
下面这些厂商和组织参与了本标准的制定,非常感谢它们:ActiveState, Borland, CSK Corp., 惠普, IBM, 英特尔,
IT University of Copenhagen, Jaggersoft (UK), 微软, Mountain View Compiler, Monash University
(AUS), Netscape, Novell, Pixo, Plum Hall, Sun, and the University of Canterbury (NZ).
C#标准的这个版本是从2003年1月开始编写的。
(译注:下载英文原版
posted @ 2009-03-18 13:56 apple123 阅读(171) 评论(0) 编辑