当前位置:文档之家› C#中using关键字用法

C#中using关键字用法

C#中using关键字用法
C#中using关键字用法

C#中using关键字用法

1、引用命名空间。

2、为命名空间或类型创建别名。

3、使用using语句。

1、引用命名空间,这样就可以直接在程序中引用命名空间的类型而不必指定详细的命名空间。

这个就不用说了吧,比如大家最常用的:using System.Text;

2、为命名空间或类型创建别名:

当同一个cs引用了不同的命名空间,但这些命名控件都包括了一个相同名字的类型的时候,可以使用using关键字来创建别名,这样会使代码更简洁。注意:并不是说两个名字重复,给其中一个用了别名,另外一个就不需要用别名了,如果两个都要使用,则两个都需要用using来定义别名的。

using System;

using aClass = NameSpace1.MyClass;

using bClass = NameSpace2.MyClass;

......

//使用方式

aClass my1 = new aClass();

Console.WriteLine(my1);

bClass my2 = new bClass();

Console.WriteLine(my2);

3、使用using语句,定义一个范围,在范围结束时处理对象。(不过该对象必须实现了IDisposable接口)。其功能和try ,catch,Finally完全相同。

比如:

using (SqlConnection cn = new SqlConnection(SqlConnectionString)){......}//数据库连接

using (SqlDataReader dr = db.GetDataReader(sql)){......}//DataReader

PS:这里SqlConnection和SqlDataReader对象都默认实现了IDisposable接口,如果是自己写的类,那就要自己手动来实现IDisposable接口。比如:

using (Employee emp = new Employee(userCode))

{

......

}

Emlpoyee.cs类:

public class Employee:IDisposable

{

实现IDisposable接口#region 实现IDisposable接口

/**////

/// 通过实现IDisposable接口释放资源

///

public void Dispose()

{

Dispose(true);

GC.SuppressFinalize(this);

}

/**////

/// 释放资源实现

///

///

protected virtual void Dispose(bool disposing)

{

if (!m_disposed)

{

if (disposing)

{

// Release managed resources

if(db!=null)

this.db.Dispose();

if(dt!=null)

this.dt.Dispose();

this._CurrentPosition = null;

this._Department = null;

this._EmployeeCode = null;

}

// Release unmanaged resources

m_disposed = true;

}

}

/**////

/// 析构函数

///

~Employee()

{

Dispose(false);

}

private bool m_disposed;

#endregion

}

使用using语句需要注意的几点:

3.1、对象必须实现IDisposeable接口,这个已经说过,如果没有实现编译器会报错误。

如:

using( string strMsg = "My Test" )

{

Debug.WriteLine( strMsg );//Can't be compiled

}

3.2、第二个using对象检查是静态类型检查,并不支持运行时类型检查,因此如下形式也会出现编译错误。

SqlConnection sqlConn = new SqlConnection( yourConnectionString );

object objConn = sqlConn;

using ( objConn )

{

Debug.WriteLine( objConn.ToString() );//Can't be compiled

}

不过对于后者,可以通过“as”来进行类型转换方式来改进。

SqlConnection sqlConn = new SqlConnection( yourConnectionString );

object objConn = sqlConn;

using ( objConn as IDisposable )

{

Debug.WriteLine( objConn.ToString() );

}

3.3、当同时需要释放多个资源时候,并且对象类型不同,可以这样写:

using( SqlConnection sqlConn = new SqlConnection( yourConnectionString ) ) using( SqlCommand sqlComm = new SqlCommand( yourQueryString, sqlConn ) ) {

sqlConn.Open();//Open connection

/Operate DB here using "sqlConn"

sqlConn.Close();//Close connection

}

如果对象类型相同,可以写到一起:

using (Font MyFont = new Font("Arial", 10.0f), MyFont2 = new Font("Arial", 10.0f))

{

// use MyFont and MyFont2

} // compiler will call Dispose on MyFont and MyFont2

3.4、using关键字只是针对C#语句,对于VB等其他语言还没有对应的功能。

关于.Net资源释放问题,也就是对于非内存的资源,最好使用IDisposable接口提供的Dispose来释放。

很明显,Dispose方法是一个外部方法,系统并不会帮你调用。为了尽早释放对象所占用的资源,所以需要保证Dispose方法能尽早被执行。那么在.Net中提供了一个比较简便的方法,就是对于实现了IDisposable接口的类型对象提供了using语句。

就操作一个数据库这个例子来说,使用using语句可以如下:

using( SqlConnection sqlConn = new SqlConnection( yourConnectionString ) ) {

sqlConn.Open(); //Open connection

//Operate DB here using "sqlConn"

sqlConn.Close(); //Close connection

}

但是有时候当多个对象需要释放的候,例如:

SqlConnection sqlConn = new SqlConnection( yourConnectionString );

SqlCommand sqlComm = new SqlCommand( yourQueryString, sqlConn );

using(sqlConn as IDisposable)

using(sqlComm as IDisposable)

{

sqlConn.Open(); //Open connection

sqlComm.ExecuteNonQuery(); //Operate DB here

}

这时候要特别注意,需要确保在发生异常的情况下,所有对象都能正常释放。显然,这段程序块,当构造“sqlComm”对象发生异常,会造成“sqlConn”对象无法及时被释放。虽说构造函数内部很少发生异常,或者说编写程序的时候要尽量避免从构造函数内向外散发异常。不过这里所说的意思是,要尽量把需要释放的对象放到using或者try-catch程序块,并作局部的异常处理,避免异常造成有些对象没有被释放。那么改进的方法,例如可以如下。 using( SqlConnection sqlConn = new SqlConnection( yourConnectionString ) ) using( SqlCommand sqlComm = new SqlCommand( yourQueryString, sqlConn ) )

{

try

{

sqlConn.Open(); //Open connection

sqlComm.ExecuteNonQuery(); //Operate DB here

}

catch( SqlException err )

{

MessageBox.Show( err.Message );

}

catch( Exception err )

{

MessageBox.Show( err.Message );

}

}

(如上,即使在构造“sqlComm”出现异常,也会释放“sqlConn”对象。同时在这里多谢 lmtz 网友对文章提出的异议,从而使我重新审查此文,并进行修正。)

但是对于using程序块来说,它有两个限制。

第一个就是using所对应的对象必须继承IDisposable,如果此对象没有继承IDisposable接口的话,系统会提示编译错误。

例如:

using( string strMsg = "My Test" )

Debug.WriteLine( strMsg ); //Can't be compiled

第二个using对象检查是静态类型检查,并不支持运行时类型检查,因此如下形式也会出现编译错误。

SqlConnection sqlConn = new SqlConnection( yourConnectionString );

object objConn = sqlConn;

using ( objConn )

{

Debug.WriteLine( objConn.ToString() ); //Can't be compiled

}

不过对于后者,可以通过“as”来进行类型转换方式来改进。

SqlConnection sqlConn = new SqlConnection( yourConnectionString );

object objConn = sqlConn;

using ( objConn as IDisposable )

{

Debug.WriteLine( objConn.ToString() );

}

对于Dispose函数的调用来说,使用using程序块来完成只是最常用的方法,除此外,还可以用try-finally来完成,例如:

SqlConnection sqlConn = new SqlConnection( yourConnectionString );

try

{

sqlConn.Open();

//Operate DB here using "sqlConn"

}

finally

{

if( sqlConn != null )

sqlConn.Dispose();

}

为了及早释放对象所占用的非托管资源,因此要保证Dispose方法能在使用完对象后被调用,.Net提供了using程序块和try-finally程序块两个方法,两者并没有太大的区别,可能使用using能使程序看得比较简明,但是为了防止异常,需要在using中加入try-catch,这样反而不如try-finally看得舒服,不过这也只是我个人的看法。总的来说,只要把方法合理整合到应用程序当中才是最重要的。

public DataSet GetRoleList()

{

using(DataSet roles=RunProcedure("sp_Accounts_GetAllRoles",new IDataParameter[] {},"Roles"))

{

return roles;

}

}

using 的作用我记得是这样的。using后面的括号表示这里面有重要的资源产生,

using下面的 {}表示在这段代码运行完后释放掉那个

“副”的几种用法

2. 职务的误译 在翻译职务时, 最容易误译的是翻译“副”职时, 因为表示 “副……”的有“deputy”“vice”、“associate”、“assistant”、 “under”、“sub”等, 且迄今为止, 我国还没有就汉语“副职”的英 译建立起一个统一的标准, 致使英译的形式多样, 缺少章法, 使得外国听众不知所云, 有时甚至引起误解。其实经过调查分 析, 表示“副”意思的英语词素与其它词汇在搭配时具有特定 的语法规则和语用规则。 2.1 Deputy 有人认为“deputy”经常和一些表示职位相对较低的词连 用, 这种说法不一定正确。和它搭配频率较高的词汇有: minister,leader,chairman,director,mayor,editor,manager,secretary –general,等。可以看出, deputy 主要用来表示企业、事业、行政 部门的副职。 2.2 Vice- 有人认为Vice- 常和Chairman 这样的表示职位相对高 的词连用。但是, 并不意味着vice- 不能和表示一般职位的词 连用, 例如, 我们也可以说: vice- manager( 副经理).同时, Vice 与表示“正职”名词搭配的方式比较固定, 它常和President, Chairman, Chancellor 等连用。 所以, 我们认为, Vice- 不一定只与表示职位相对较高的 词连用, 同样的道理,Deputy 不只是与所谓表示职位相对较低 的词连用。 2.3 Associate Associate 在大多数情况下用作名词, 表示“助理”的意思。 在用作“副”的意思时, 它主要用来表示立法和执法部门的副 职。但是, Assistant Manager 不是我们通常所指的“经理助理”, 因为“经理助理”只是经理的一般帮手, 他可能没有头衔. Assistant Manager 可以理解翻译为“助理经理”或“副经理”因为当经理不在时, Assistant Manager 通常可以代替经理处理日 常事务。 2.4 Under- 表示职务的名词和under- 搭配的只有secretary- general 和secretary,指的是联和国、部、厅等机关的副秘书长、次长等。 2.5 Sub- 与sub- 搭配表示副职的词较少, 只有sub dean( 大学的副 教务长、副系主任) 、sub- agent( 副代理人) 、sub prefect( 副县 长) 、sub deacon( 副助祭) "副"字在英语中可以用vice、deputy、assistant、associate、under、sub等词表示。 副总裁Vice President

typedef关键字用法 免费下载

typedef用法 1、为现有数据类型定义同义词 typedef使用最多的地方是创建易于记忆的类型名,用它来归档程序员的意图。 例如: typedef int size; 此声明定义了一个int的同义字,名字为size。注意typedef并不创建新的类型。 它仅仅为现有类型添加一个同义字。你可以在任何需要int的上下文中使用size: void measure(size*psz); size array[4]; 2、typedef还可以掩饰复合类型,如指针和数组 z数组 例如:typedef char Line[81];表示使用Line代表具有81个元素的char类型数组。如果要生成类似的数据可以使用如下形式:Line text,secondline; 相当于char test[81];char secondline[81]; z隐藏指针语法 例如:typedef char*pstr; int mystrcmp(pstr,pstr);相当于 int mystrcmp(char*,char*); 注意:标准函数strcmp()有两个‘const char*'类型的参数。因此,它可能会误导人们象下面这样声明mystrcmp(), int mystrcmp(const pstr,const pstr); 这是错误的,‘const pstr'被解释为‘const char*‘(一个指向char的常量指针),而不是‘char*'(指向char的指针)。 修改:添加,typedef const c pstr; 记住:不管什么时候,只要为指针声明typedef,那么都要在最终的typedef 名称中加一个const,以使得该指针本身是常量,而不是对象 z链表中应用 例如: typedef struct node {

typedef使用详解

typedef使用详解 1.再论typedef 1.1、如何轻松理解和应用typedef? typedef用最简单的话去诠释他,那么就是给类型取别名。但是牠并没有你想象的那么简单!举例:typedef int size;//那么int就有一个别名叫size了,以后size就和int这个类型是一样的用法了。 看到这里,如果你仅仅认为typedef不过如此,不就是把第一个参数(类型名),等同于第二个参数,这么简单。那你可能就会陷入困境。 比如看下面这个例子: typedef char Line[81]; 你能说Line[81]就是char的别名吗?这显然不对。它真正的含义是:Line类型即代表了具有81个元素的字符数组。那么Line t;就等同于char t[81];看到这里读者是否晕了?我们尝试把它放在一起看看。 typedef int size; //typedef行 int i; //原型行 size i; //应用行 同理: typedef char Line[81]; //typedef行 char t[81]; //原型行 Line t; //应用行 再举一个函数指针的例子: typedef int (*fun_ptr)(int,int); //typedef行 int (*fp)(int,int); //原型行 fun_ptr fp; //应用行 以上3个例子都有以下几个共同点: 1、“typedef行”和“原型行”相比,“typedef行”仅仅多个typedef而已。就函数指针的例子来说,其次,“typedef行”和“原型行”的根本区别在于:fun_ptr是类的别名,fp是该类的变量。 2、“原型行”和“应用行”,它们的编译结果是一样的。就函数指针的例子来说,他们都是创建了一个类型为int (*)(int,int)的函数指针fp。只是fun_ptr fp(应用行)比int (*fp)(int,int)(原型行)这种形式更加简洁,便与书写和理解。形式越复杂typedef 的优势就越明显。 Typedef的定义应用和理解应该是一步到位的。 定义过程:只要我们能写出原型行,就能直接写出typedef行。应为形式上只差一个typedef。如:我们写出原型:char t[81],那么加上一个typedef就能得到我们想要的定义,当然可以修改下类名,如:typedef char T[81]。 应用过程:T t;其中T是之前定义的类型,t是通过该类型定义的变量。 理解过程:如何理解“T t;”要想理解“T t;”就找到与之对应的“原型行”,但是“原型行”一般在程序中是不会出现,所以只能先找到“typedef行”,在通过“typedef行”推出“原型行”(推的过程就是去掉typedef而已)。 “T t;”的“typedef行”为typedef char T[81],所以“T t”所表示的“原型行”就是char x[81],而“原型行”和“应用行”(这里“T t;”就是应用行),的含义完全相同。那么对“T t;”的理解就是对char x[81]的理解。 在“T t”的定义中,T的typedef定义形式为:

Do_的四种用法

助动词的用法 一、助动词do的用法 在英语中,助动词本身没有意义,只是帮助实义动词完成某些语法功能,如构成否定句、疑问句、简略答语等。 do 有两种形式 原形 现在时第三人称单数 do的基本用法: 构成否定句 构成一般疑问句及回答 构成特殊疑问句 1.原形 肯定式: do 否定式: do not 缩略否定式: don’t 用法:do用在第一人称单复数(I,we…)、第二人称单复数(you…)和第三人称复数(they…)做主语,且时态为一般现在时的句子中,构成否定句、一般疑问句及回答、特殊疑问句。 Examples: I like this red hat. 我喜欢这顶红色的帽子。 否定句:我不喜欢这顶红色的帽子。 I don’t like this red hat. 一般疑问句及回答:你喜欢这顶红色的帽子吗? 是的,我喜欢。∕不,我不喜欢。 Do you like this red hat? Yes, I do./ No, I don’t. 特殊疑问句: 你喜欢哪一顶帽子?Which hat do you like? Lily and I want to go to Beijing. 莉莉和我想去北京。

否定句: Lily and I don't want to go to Beijing. 莉莉和我不想去北京。 一般疑问句及回答: Do Lily and you want to go to Beijing? Yes, we do. ∕No, we don't. 莉莉和你想去北京吗? 是的,我们想去。∕不,我们不想去。 特殊疑问句:Where do Lily and you want to go? 莉莉和你想去哪儿? 练习:1、我不喜欢狗。 Idon't like dogs. 2、你喜欢什么颜色? What color do you like? 3、你有词典吗?是的,我有。 Do you have a dictionary? Yes, I do. 2.现在式第三人称单数 肯定式: does 否定式: does not 缩略否定式:doesn’t 用法:does用在第三人称单数做主语,且时态为一般现在时的句子中。注意:当does出现时,句子中用动词原形。 Examples: She likes that red dress. 否定句:She doesn’t like that red dress. 一般疑问句及回答:Does she like that red dress? Yes, she does./ No, she doesn’t. 特殊疑问句:Which dress does she like? 课堂练习:

C#使用using语句清理非托管资源样例

有不少做.net的程序员是从其他语言转过来的,开始用C#的时候可能这样连接数据库: using System; using System.Collections; using System.Configuration; using System.Data; using System.Data.SqlClient; using System.Linq; using System.Web; using System.Web.Security; using System.Web.UI; using System.Web.UI.HtmlControls; using System.Web.UI.WebControls; using System.Web.UI.WebControls.WebParts; using System.Xml.Linq; namespace WebApplication1 { public partial class _Default : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) { SqlConnection cnn = null; try { cnn = cnn = new SqlConnection("ConnectionString"); // 创建数据库连接 cnn.Open(); // 打开数据库 // 操作数据库...... } finally { if (cnn != null) // 如果数据库连接不为空就关闭 { cnn.Close(); } } } } } 其实有一种简洁、美观的方式值得借签: using System;

C语言的32个关键字意义与用法

C语言的32个关键字意义与用法 2009-11-20 13:19 1)auto 声明自动变量。可以显式的声明变量为自动变量,只要不是声明在所有函数文前的变量,即使没有加auto关键字,也默认为自动变量。并且只在声明它的函数内有效。而且当使用完毕后,它的值会自动还原为最初所赋的值。自动变量使用时要先赋值,因为其中包含的是未知的值例如:auto int name=1 2)static: 声明静态变量。可以显式的声明量为静态变量。也为局部变量。只在声明它的函数内有效。它的生命周期从程序开始起一直到程序结束。而且即使使用完毕后,它的值仍不还原。即使没有给静态变量赋值,它也会自动初始化为0,例:static int name=1 3)extern: 声明全局变量。用时声明在main函数之前的变量也叫全局变量。它可以在程序任何地方使用。程序运行期间它一直存在的。全局变量也会初始化为0,例:extern int name 4)register: 声明为寄存器变量。也为局部变量,只在声明它的函数内有效。它是保存寄存器中的,速度要快很多。对于需要频繁使用的变量,使用它来声明会提高程序运行速度。例: register int name=1 5)int: 声明量的类型。int为整数型。注意在16位和32位系统中它的范围是不用的。16位中占用2个字节;32位中占用4个字节。还可以显式的声明为无符号或有符号:unsigned int signed int.有符号和无符号的区别就是把符号也当作数字位来存储;也可以用short和long来声明为短整型或长整行例: int mum 6)float: 声明变量的类型。float浮点型,也叫实型。它的范围固定为4个字节。其中6位小数位,其他为整数位。例: float name 7)double: 声明为双精度类型。它的范围为8个字节,14位为小数位。也可使用更高精度的long double.它的范围则更大,达到10字节。例: double name 8)struct: 声明结构体类型。结构体可以包含各种不类型的量。比如可以把整型,字符型等类型的变量声明在同一个结构体种,使用的时候使用结构体变量直接可以调用。例: struct some{ int a=1; float b=1.1 double=1.1234567 }KKK;

以为的几种用法

以为的几种用法 邢台市第五中学李敬华 “以为”在古汉语中使用频率很高。因为“以”和“为”都有多种用法,所以两个字搭配在一起就有了多种含义,“以为”可以是连用,也可以是“以……为……”。现对课本中出现的几种形式作一简单总结: 一“以为”等于现代汉语中的“认为” 例: (1)“老臣窃以为媪之爱燕后,贤于长安君。” (我私下认为您疼爱燕后就超过了疼爱长安君。) (2)故以为其爱不若燕后。(因此我认为您疼爱他(长安君)比不上疼爱燕后。) (3)闻道百,以为莫己若者,我之谓也。(听到了上百条道理,便认为天下再没有谁能比得上自己’的,说的就是我这样的人了。) 二“以……为……”中“以”是介词“把”,“为”是动词“作为”或“当作” 例:(1)必以长安君为质,兵乃出。(一定要把长安君来做人质,援兵才能派出。”)

(2)然后以六合为家,崤函为宫。(然后将天下作为一家私产,把崤山、函谷关作为宫墙) 三“以……为……”中“以”是动词“认为”,“为”是介词“替” 例:老臣以媪为长安君计短也。(我认为您替长安君打算得太短了) 四“以为”连用,却相当于“以……为……”“以为”中间省略“之” 例:(1)若舍郑以为东道主,行李之往来,共其乏困。(假如放弃灭郑的打算,而让郑国作为您秦国东道上的主人,秦国使者往来,郑国可以随时供给他们所缺乏的东西)(2)收天下之兵,聚之咸阳,销锋镝,铸以为金人十二,以弱天下之民。(收缴天下的兵器,集中在咸阳,去掉刀刃和箭头,把它铸成十二个金人,以便削弱百姓的反抗力量。) (3)南取百越之地,以为桂林、象郡。(向南攻取百越的土地,把它划为桂林郡和象郡) 五“以……为……”实际上相当于“以为”,译作“认为” 例:以天下之美为尽在己。(认为天下一切美好的东西全都聚集在自己这里。)

C#的New关键字的几种用法

C#的New关键字的几种用法 2009年01月24日星期六 09:34 前段时间一个朋友问到C#的New关键字有几种用法,虽说在日常编程中经常用到这个小家伙,但它到底有几种用法还真没有留意过,现将从网上总结出的资料记下以供同仁学习。 (1)new 运算符用于创建对象和调用构造函数。 (2)new 修饰符用于隐藏基类成员的继承成员。 (3)new 约束用于在泛型声明中约束可能用作类型参数的参数的类型。 new 运算符 1.用于创建对象和调用构造函数 例:Class_Test MyClass = new Class_Test(); 2.也用于为值类型调用默认的构造函数 例:int myInt = new int(); myInt 初始化为 0,它是 int 类型的默认值。该语句的效果等同于:int myInt = 0; 3.不能重载 new 运算符。 4.如果 new 运算符分配内存失败,则它将引发 OutOfMemoryException 异常。 new 修饰符 使用 new 修饰符显式隐藏从基类继承的成员。若要隐藏继承的成员,请使用相同名称在派生类中声明该成员,并用 new 修饰符修饰它。 请看下面的类: 1 public class MyClass 2 3 { 4 5 public int x; 6 7 public void Invoke() {}

9 } 10 在派生类中用 Invoke 名称声明成员会隐藏基类中的 Invoke 方法,即: 1 public class MyDerivedC : MyClass 2 3 { 4 5 new public void Invoke() {} 6 7 } 8 但是,因为字段 x 不是通过类似名隐藏的,所以不会影响该字段。 通过继承隐藏名称采用下列形式之一: 1.引入类或结构中的常数、指定、属性或类型隐藏具有相同名称的所有基类成员。 2.引入类或结构中的方法隐藏基类中具有相同名称的属性、字段和类型。同时也隐藏具有相同签名的所有基类方法。 3.引入类或结构中的索引器将隐藏具有相同名称的所有基类索引器。 4.在同一成员上同时使用 new 和 override 是错误的。 注意:在不隐藏继承成员的声明中使用 new 修饰符将生成警告。 示例 在该例中,嵌套类 MyClass 隐藏了基类中具有相同名称的类。该例不仅说明了如何使用完全限定名访问隐藏类成员,同时也说明了如何使用 new 修饰符消除警告消息。 using System; public class MyBaseC { public class MyClass { public int x = 200; public int y;

C语言中typedef用法

[编辑本段] C语言中typedef用法 1. 基本解释 typedef为C语言的关键字,作用是为一种数据类型定义一个新名字。这里的数据类型包括内部数据类型(int,char等)和自定义的数据类型(struct等)。 在编程中使用typedef目的一般有两个,一个是给变量一个易记且意义明确的新名字,另一个是简化一些比较复杂的类型声明。 至于typedef有什么微妙之处,请你接着看下面对几个问题的具体阐述。 2. typedef & 结构的问题 当用下面的代码定义一个结构时,编译器报了一个错误,为什么呢?莫非C语言不允许在结构中包含指向它自己的指针吗?请你先猜想一下,然后看下文说明:typedef struct tagNode { char *pItem; pNode pNext; } *pNode; 答案与分析: 1、typedef的最简单使用 typedef long byte_4; 给已知数据类型long起个新名字,叫byte_4。 2、typedef与结构结合使用 typedef struct tagMyStruct { int iNum; long lLength; } MyStruct; 这语句实际上完成两个操作: 1) 定义一个新的结构类型 struct tagMyStruct { int iNum; long lLength; }; 分析:tagMyStruct称为“tag”,即“标签”,实际上是一个临时名字,struct 关键字和tagMyStruct一起,构成了这个结构类型,不论是否有typedef,这个结构都存在。

我们可以用struct tagMyStruct varName来定义变量,但要注意,使用tagMy Struct varName来定义变量是不对的,因为struct 和tagMyStruct合在一起才能表示一个结构类型。 2) typedef为这个新的结构起了一个名字,叫MyStruct。 typedef struct tagMyStruct MyStruct; 因此,MyStruct实际上相当于struct tagMyStruct,我们可以使用MyStruct var Name来定义变量。 答案与分析 C语言当然允许在结构中包含指向它自己的指针,我们可以在建立链表等数据结构的实现上看到无数这样的例子,上述代码的根本问题在于typedef的应用。 根据我们上面的阐述可以知道:新结构建立的过程中遇到了pNext域的声明,类型是pNode,要知道pNode表示的是类型的新名字,那么在类型本身还没有建立完成的时候,这个类型的新名字也还不存在,也就是说这个时候编译器根本不认识pNo de。 解决这个问题的方法有多种: 1)、 typedef struct tagNode { char *pItem; struct tagNode *pNext; } *pNode; 2)、 typedef struct tagNode *pNode; struct tagNode { char *pItem; pNode pNext; }; 注意:在这个例子中,你用typedef给一个还未完全声明的类型起新名字。C语言编译器支持这种做法。 3)、规范做法: struct tagNode { char *pItem; struct tagNode *pNext; }; typedef struct tagNode *pNode; 3. typedef & #define的问题

C# Using用法三则

用法三则 C# Using C#关键字的用法不单只有一种方法的。现在我总结了一下Using和New的用法,顺便也是为了帮助大家更好的理解C# using用法。 Using (1)引用命名空间 using作为引入命名空间指令的用法规则为: using Namespace; 在.NET程序中,最常见的代码莫过于在程序文件的开头引入System命名空间,其原因在于System命名空间中封装了很多最基本最常用的操作,下面的代码对我们来说最为熟悉不过:using System; 这样,我们在程序中就可以直接使用命名空间中的类型,而不必指定详细的类型名称。using 指令可以访问嵌套命名空间。 关于:命名空间 命名空间是.NET程序在逻辑上的组织结构,而并非实际的物理结构,是一种避免类名冲突的方法,用于将不同的数据类型组合划分的方式。例如,在.NET中很多的基本类型都位于System命名空间,数据操作类型位于System.Data命名空间, (2)创建命名空间别名 using为命名空间创建别名的用法规则为: using alias = namespace | type; 其中namespace表示创建命名空间的别名;而type表示创建类型别名。例如,在.NET Office 应用中,常常会引入Microsoft.Office.Interop.Word.dll程序集,在引入命名空间时为了避免繁琐的类型输入,我们通常为其创建别名如下: using MSWord = Microsoft.Office.Interop.Word; 这样,就可以在程序中以MSWord来代替Microsoft.Office.Interop.Word前缀,如果要创建Application对象,则可以是这样, 而且还有一个好处就是,在一个.CS文件中引入了不同的命名空间但是相同的类名的时候,用别名就可以解决这问题了。

typedef用法详解

引子: 请讲讲这道题怎么做呢及其相关结构体定义的问题十分感谢 以下结构体类型说明和变量定义中正确的是 A)typedef struct B)struct REC; { int n; char c;}REC; { int n; char c;}; REC t1,t2; REC t1,t2; C)typedef struct REC; D)struct { int n=0; char c='A';}t1,t2; { int n; char c;}REC; REC t1,t2; 可以详细的解释一下这道题吗?其他的错在哪里了呢 十分感谢 我见过这样的题,没看懂你的意思,不过我看这样说吧, struct a {... }B; 我打。。。的地方表示你可以在那里添加所有的数据形式的定义,比如,int a;char a[10];等等; 而B表示变量名。就如同int a的a一样,只是一个变量标示符,他就是一个结构体变量了。当你使用typedef使,它表示的是枚举类型,功能如同宏定义一样, 使用他的时候方法如下: 首先写出你要表示的变量类型。列如:int a;然后在int的前面加上typedef, typedef int a;然后把变量名a 改变成你要使用的表示符如 pp; 现在就变成 typedef int pp; 当你要在定义其他的变量是int型的时候,你就可以这样定义了 pp b; 这里的b就是变量名了。注意枚举类型它并不产生新的变量类型,只是一种替代作用。我在给你举个列子吧typedef struct a{ int s; char p[10]; } num; num n; 这时候n就是 struct a 类型的结构体变量了。不知道你懂没有。。。 C语言中typedef用法 1. 基本解释 typedef为C语言的关键字,作用是为一种数据类型定义一个新名字。这里的数据类型包括内部数据类型(int,char等)和自定义的数据类型(struct等)。 在编程中使用typedef目的一般有两个,一个是给变量一个易记且意义明确的新名字,另一个是简化一些比较复杂的类型声明。 至于typedef有什么微妙之处,请你接着看下面对几个问题的具体阐述。 2. typedef & 结构的问题 当用下面的代码定义一个结构时,编译器报了一个错误,为什么呢?莫非C语言不允许在结构中包含指向它自己的指针吗?请你先猜想一下,然后看下文说明: typedef struct tagNode { char *pItem; pNode pNext; } *pNode;

C语言typedef用法总结

C语言typedef用法总结 黄海涛,2012-3-11 C语言中的typedef可以让人感觉很清新,但也可以让人感觉神秘。当你一层层剥开它的时候,神秘的面纱终会摘下…… 让我们一起来探究其中的秘密吧! 一、概述 1、类型定义符typedef C语言提供了一个称为typedef的工具,它允许你为各种数据类型定义新的名字。 定义形式: typedef 原类型名新类型名; 它的格式与变量声明完全一样,只是把typedef这个关键字放在声明的前面,但typedef并不创建变量,而是为指定类型引入一个新的名字。 2、实质 其实质是:为现有类型取个新名字,它并没有引入新的类型。 typedef是一种声明形式,它为一种类型引入新的名字,而不是产生新的类型,也不会为变量分配空间。 3、作用时机 在某些方面,typedef类似于宏文本替换,但typedef是类型定义符,在编译时会有相应类型的检查。typedef是由编译器解释的。 ▲typedef与#define的区别 A.#define后面没有分号,而typedef后面有分号; B.#define不是关键字,而typedef是关键字; C.宏定义中宏名紧跟着#define,而typedef中的类型名并不紧接其后; D.可以用其他类型说明符对宏名进行扩展,但对typedef定义的类型名却不行;例如: E.在连续几个变量声明中,typedef定义的类型名可以保证声明中所有的变量均为同一种类型,而#define定义的宏名则无法保证。 4、使用原因 1)表达方式更简洁,简化编程; 2)使程序参数化,提高程序的可移植性; 3)为程序提供更好的说明性,可以引入一个易记且意义明确的新名字,提升可维护性。 5、缺点 允许一些看上去混乱的语法,可以把几个声明放在一个声明中。如:

破折般有以下几种用法

破折般有以下几种用法集团文件版本号:(M928-T898-M248-WU2669-I2896-DQ586-M1988)

破折号一般有以下几种用法:1、表示破折号后面是解释说明的部分。 (1)各国政府——无论专制政府或共和政府都驱逐他。 (2)带工老板或者打杂的拿着一叠叠的名册,懒散地站在正门口——好像火车站剪票处一般的木栅子前面 2、表示意思的递进。 每年——特别是水灾、旱灾的时候,这些在日本厂里有门路的带工…… 3、表示意思的转换、跳跃或转折。 (1)“今天好热啊!——你什么时候去上海?” (2)我本来不想去,可是俺婆婆非叫我再去看看他——有什么看头啊! 4、表示语音的延长 (1)“小林——,我来了!”他大喊着 (2)“呜——呜——呜”小男孩大声哭起来。 (3)我们在天安门前深情的呼唤:周——总——理—— 5、表示语音较大的停顿或中断。 那个时候在无锡的人,我倒问过,可是——(表示说话中断) 破折号作用主要有: 1、表示解释说明。 例句:迈进金黄色的大门,穿过宽阔的风门厅和衣帽厅,就到了大会堂建筑的枢纽部分——中央大厅。 2、表示意思的转折及转换。 例句:到山上打柴的记忆至今都是幸福而快乐的——尽管那是童年十分辛苦的一种劳作。 例句:“好香的菜,——听到风声了吗?”赵七爷站在七斤的后面说。 3、表示意思的递进。 例句:自然是读着,读着,强记着——而且要背出来。 4、用于标明语句间的因果关系,破折号前是果,后是因。 例句:他首先指出早恋并不可耻——这是一种十分自然、正常的现象……早恋并不可爱——早结的果不甜,早开的花早谢。 5、表示声音的延长、中断或停顿。 6、表示分项列举。 7、用于副标题前。 ● 【提示】破折号与逗号都有强调的作用,一般逗号强调的是前面的内容,而破折号强调的是后面的内容。 例句:我,是第一个跑到终点的。 那就是我——一名普通的中学教师。 当语句容易引起误解时要用两个破折号。破折号前可用点号以示强调突出。 如:我有四年多,曾经常常,——几乎是每天——出入于质铺和药店 1,他们的脸却恒常浮着——像晴空,在整个雨季中我们不见它,却清晰地记得它。 2,有一个女老师——我连她的脸都记不起来了,但好象觉得她是美的。3,我立刻快乐得有有如肋下生翅一般——我平生似乎再也没有出现那么自豪的时刻。 4,泥土的大地可以成为那么美好的纸张,尖锐的利石可以成为那么流利的彩笔——我第一次懂得。 ① 语意的跃进; ② 话题的转换;③解释说明; ④ 时间或声音的延续

type的用法

1. 常规变量类型定义 例如:typedef unsigned char uchar 描述:uchar等价于unsigned char类型定义uchar c声明等于unsigned char c声明 2.数组类型定义 例如:typedef int array[2]; 描述:array等价于int [2]定义; array a声明等价于int a[2]声明 扩展:typedef int array[M][N]; 描述:array等价于int [M][N]定义; array a声明等价于int a[M][N]声明 3.指针类型定义 例如:typedef int *pointer; 描述:pointer等价于int *定义;pointer p声明等价于int *a声明 例如:typedef int *pointer[M]; 描述:pointer等价于int *[M]定义pointer p声明等价于int *a[M]声明明 4.函数地址说明 描述:C把函数名字当做函数的首地址来对待,我们可以使用最简单的方法得到函数地址 例如:函数:int func(void); unsigned long funcAddr=(unsigned long)func,funcAddr 的值是func函数的首地址 5.函数声明 例如:typedef int func(void); func等价于int (void)类型函数 描述1:func f声明等价于int f(void)声明,用于文件的函数声明 描述2:func *pf声明等价于int (*pf)(void)声明,用于函数指针的生命,见下一条 6.函数指针 例如:typedef int (*func)(void) 描述:func等价于int (*)(void)类型 func pf等价于int (*pf)(void)声明,pf是一个函数指针变量 7.识别typedef的方法: a).第一步。使用已知的类型定义替代typdef后面的名称,直到只剩下一个名字不识别为 正确 如typedef u32 (*func)(u8); 从上面的定义中找到typedef __u32 u32;typedef __u8 u8 继续找到typedef unsigned int __u32;typedef unsigned char __u8; 替代位置名称typedef unsigned int (*func)(void); 现在只有func属于未知。 b).第二步.未知名字为定义类型,类型为取出名称和typedef的所有部分,如上为 func等价于unsigned unsigned int (*)(unsigned char);

interrupt、using关键字的用法

C语言在8051单片机上的扩展(interrupt、using关键字的用法) 直接访问寄存器和端口 定义 sfr P0 0x80 sfr P1 0x81 sfr ADCON; 0xDE sbit EA 0x9F 操作 ADCON = 0x08 ; P1 = 0xFF ; io_status = P0 ; EA = 1 ; 在使用了interrupt 1 关键字之后,会自动生成中断向量 在ISR中不能与其他"后台循环代码"(the background loop code) 共享局部变量 因为连接器会复用在RAM中这些变量的位置,所以它们会有不同的意义,这取决于当前使用的不同的函数 复用变量对RAM有限的51来将很重要。所以,这些函数希望按照一定的顺序执行而不被中断。 timer0_int() interrupt 1 using 2 { unsigned char temp1 ; unsigned char temp2 ; executable C statements ; } "interrupt"声明表示向量生成在(8*n+3),这里,n就是interrupt参数后的那个数字 这里,在08H的代码区域生成LJMP timer0_int 这样一条指令 "using" tells the compiler to switch register banks on entry to an interrupt routine. This "context" switch is the fastest way of providing a fresh registerbank for an interrupt routine's local data and is to be preferred to stacking registers for very time-critical routines. Note that interrupts of the same priority can share a register bank, since there is no risk that they will interrupt each other. 'using' 告诉编译器在进入中断处理器去切换寄存器的bank。这个"contet"切换是 为中断处理程序的局部变量提供一个新鲜的寄存器bank 最快的方式。对时序要求严格的程序,是首选的stack寄存器(保存寄存器到stack)方式。

#define 用法大全

#define用法集锦[修正版] Definition[定义]: The #define Directive You can use the #define directive to give a meaningful name to a constant in your program. The two forms of the syntax are: Syntax #define identifier token-stringopt #define identifier[( identifieropt, ... , identifieropt )] token-stringopt Usage[用法]: 1.简单的define定义 #define MAXTIME 1000 一个简单的MAXTIME 就定义好了,它代表1000,如果在程序里面写 if(i(y)?(x):(y); 这个定义就将返回两个数中较大的那个,看到了吗?因为这个“函数”没有类型检查,就好像一个函数模板似的,当然,它绝对没有模板那么安全就是了。可以作为一个简单的模板来使用而已。 但是这样做的话存在隐患,例子如下: #define Add(a,b) a+b; 在一般使用的时候是没有问题的,但是如果遇到如:c * Add(a,b) * d 的时候就会出现问题,代数式的本意是a+b 然后去和c,d 相乘,但是因为使用了define(它只是一个简单的替换),所以式子实际上变成了c*a + b*d 另外举一个例子: #define pin (int*); pin a,b; 本意是a 和b 都是int 型指针,但是实际上变成int* a,b; a 是int 型指针,而 b 是int 型变量。 这是应该使用typedef 来代替define,这样a 和b 就都是int 型指针了。

Oracle中Using用法

Oracle中Using用法 1.静态SQLSQL与动态SQL Oracle编译PL/SQL程序块分为两个种:其一为前期联编(early binding),即SQL语句在程序编译期间就已经确定,大多数的编译情况属于这种类型;另外一种是后期联编(late binding),即SQL语句只有在运行阶段才能建立,例如当查询条件为用户输入时,那么Oracle的SQL引擎就无法在编译期对该程序语句进行确定,只能在用户输入一定的查询条件后才能提交给SQL引擎进行处理。通常,静态SQL采用前一种编译方式,而动态SQL采用后一种编译方式。 本文主要就动态SQL的开发进行讨论,并在最后给出一些实际开发的技巧。 2.动态SQL程序开发 理解了动态SQL编译的原理,也就掌握了其基本的开发思想。动态SQL 既然是一种”不确定”的SQL,那其执行就有其相应的特点。Oracle中提供了Execute immediate语句来执行动态SQL,语法如下: Excute immediate 动态SQL语句using 绑定参数列表returning into 输出参数列表; 对这一语句作如下说明: 1) 动态SQL是指DDL和不确定的DML(即带参数的DML) 2) 绑定参数列表为输入参数列表,即其类型为in类型,在运行时刻与动态SQL语句中的参数(实际上占位符,可以理解为函数里面的形式参数)进行绑定。 3) 输出参数列表为动态SQL语句执行后返回的参数列表。 4) 由于动态SQL是在运行时刻进行确定的,所以相对于静态而言,其更多的会损失一些系统性能来换取其灵活性。 为了更好的说明其开发的过程,下面列举一个实例: 设数据库的 要求: 1.创建该表并输入相应的数据。 2.根据特定ID可以查询到其姓名和薪水的信息。 3.根据大于特定的薪水的查询相应的员工信息。 根据前面的要求,可以分别创建三个过程(均使用动态SQL)来实现:

c语言关键字的用法详解

1. Static用法 1.1 static声明的变量在C语言中有两方面的特征: 1)、变量会被放在程序的全局存储区中,这样可以在下一次调用的时候还可以保持原来的赋值。这一点是它与堆栈变量和堆变量的区别。 2)、变量用static告知编译器,自己仅仅在变量的作用范围内可见。这一点是它与全局变量的区别。 1.2 特点 A.若全局变量仅在单个C文件中访问,则可以将这个变量修改为静态全局变量,以降低模块间的耦合度; B.若全局变量仅由单个函数访问,则可以将这个变量改为该函数的静态局部变量,以降低模块间的耦合度; C.设计和使用访问动态全局变量、静态全局变量、静态局部变量的函数时,需要考虑重入问题; D.如果我们需要一个可重入的函数,那么,我们一定要避免函数中使用static变量(这样的函数被称为:带“内部存储器”功能的的函数) E.函数中必须要使用static变量情况:比如当某函数的返回值为指针类型时,则必须是static 的局部变量的地址作为返回值,若为auto类型,则返回为错指针。 函数前加static使得函数成为静态函数。但此处“static”的含义不是指存储方式,而是指对函数的作用域仅局限于本文件(所以又称内部函数)。使用内部函数的好处是:不同的人编写不同的函数时,不用担心自己定义的函数,是否会与其它文件中的函数同名。 扩展分析:术语static有着不寻常的历史.起初,在C中引入关键字static是为了表示退出一个块后仍然存在的局部变量。随后,static在C中有了第二种含义:用来表示不能被其它文件访问的全局变量和函数。为了避免引入新的关键字,所以仍使用static关键字来表示这第二种含义。最后,C++重用了这个关键字,并赋予它与前面不同的第三种含义:表示属于一个类而不是属于此类的任何特定对象的变量和函数(与Java中此关键字的含义相同)。 1.3 关键字static的作用是什么? 这个简单的问题很少有人能回答完全。在C语言中,关键字static有三个明显的作用:

相关主题
文本预览
相关文档 最新文档