C#速成之二(Quick C#)

摘要:
它们是使用新运算符创建的。对于这些类型,C中没有delete运算符,这与C将显式使用delete运算符来释放创建的类型这一事实有本质区别。在C#中,这些类型通过垃圾收集器自动收集和处理。类的对象在堆中分配,并由new创建。该结构也由new创建,但在堆栈中分配。在C#中,结构化数据类型适用于快速访问和具有少量成员的数据类型。
-------------------
数据类型
-------------------

所有C#数据类型都派生自基类Object。这里有两类数据类型:

基本型/内置型 用户自定义型

下面一个C#内置类型列表:

类型字节数解释 byte 1 无符号字节型 sbyte 1 有符号字节型 short 2 有符号短字节型 ushort 2 无符号短字节型 int 4 有符号整型 uint 4 无符号整型 long 8 有符号长整型 ulong 8 无符号长整型 float 4 浮点数 double 8 双精度数 decimal 8 固定精度数 string unicode字串型 char unicode字符型 bool 真假布尔型

 

注意:C#当中的类型范围与C 有所不同;例如,C 的long型是4个字节,而在C#当中是8个字节。同样地,bool型和string型都不同于C 。bool型只接受true和false两种值。不接受任何整数类型。



用户定义类型包括:

类类型(class)

结构类型(struct)

接口类型(interface)


数据类型的内存分配形式的不同又把它们分成了两种类型:

值类型(Value Types)

引用类型(Reference Types)

值类型:


值类型数据在栈中分配。他们包括:所有基本或内置类型(不包括string类型)、结构类型、枚举类型(enum type)

 

引用类型:

引用类型在堆中分配,当它们不再被使用时将被垃圾收集。它们使用new运算符来创建,对这些类型而言,不存在C 当中的delete操作符,根本不同于C 会显式使用delete这个运算符去释放创建的这个类型。C#中,通过垃圾收集器,这些类型会自动被收集处理。

引用类型包括:类类型、接口类型、象数组这样的集合类型类型、字串类型、枚举类型

枚举类型与C 当中的概念非常相似。它们都通过一个enum关键字来定义。

 

示例:

enum Weekdays
{
Saturday, Sunday, Monday, Tuesday, Wednesday, Thursday, Friday
}



类类型与结构类型的比较

除了在内存分配形式上外,类与结构的概念完全与C 相同。类的对象被分配在堆中,并且通过new来创建,结构也是被new创建但却被分配在栈当中。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 的观点来看,Data类的属性就是day、month和year。用C#方式,你可以把它们写成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;
}

}


你可在这里得到并设置这些属性:

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#速成之二(Quick C#)》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇前端页面a标签嵌套a标签效果的两种解决方案把GCC的编译信息重定向到一个文件下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

在C#和SQL Server数据库中怎么给DateTime类型赋null值、null和""的区别

今天在将数据库里的datetime类型数据赋给C#里DateTime类型变量的时候遇到一个问题,那就是数据库里面的datetime数据存在null值。 C#默认不能将null赋给DateTime变量,但是可以使用Nullable类型的DateTime,只需在声明变量的时候在DateTime后加一个?号,如: DateTime? x ; x便可以赋null值...

C#程序执行Python脚本

方法介绍:      通过调用“Python.exe”程序,执行脚本文件。所以,本方式要求电脑上已经安装了Python,拥有程序Python.exe程序。 现在,有如下py脚本:Add.py import sys def Add(a,b): return a+b if __name__=='__main__': X = int(sys....

C# OCX控件之开发

在C#中,其实没有OCX控件一说,相对应的只是COM组件,编译后也是.DLL,而不是.ocx.所以在C#中,在创建项目时只能创建类库项目。 然后就是具体的代码开发。(略) 要使组件成为能被网页脚本调用的OCX控件,在开发时,要注意以下几点: 1、必须要为将发布OCX控件的主类设置GUID码。该码在创建类库时,C#会自动生成一个(你可以使用,也可以重新生成)...

java 中的原始类型与原始封装类型

Java 提供两种不同的类型:引用类型和原始类型(或内置类型)。比如:Int是java的原始数据类型,Integer是java为int提供的封装类。Java为每个原始类型提供了封装类,常见的原始与对应的封装类如下: 原始类型 封装类 boolean Boolean char Character byte Byte short Short int Integ...

史林枫:C#.NET利用ffmpeg操作视频实战(格式转换,加水印 一步到位)

ffmpeg.exe是大名鼎鼎的视频处理软件,以命令行参数形式运行。网上也有很多关于ffmpeg的资料介绍。但是在用C#做实际开发时,却遇到了几个问题及注意事项,比如如何无损处理视频?如何在转换格式的同时添加水印,以提升处理效率?,ffmpeg的版本应该选择什么版本?。今天史林峰将用实战的方式来探索C#操作ffmpeg的奥秘。 关于ffmpeg的使用及其参...

C# aspx 数据绑定集中

Eval( " ")和Bind( " ") 这两种一个单向绑定,一个双向绑定,bind是双向绑定,但需数据源支持 ASP.NET   2.0改善了模板中的数据绑定操作,把v1.x中的数据绑定语法DataBinder.Eval(Container.DataItem,   fieldname)简化为Eval(fieldname)。Eval方法与DataBind...