C#语言教学

2024-09-13

C#语言教学(共9篇)

C#语言教学 篇1

1、引言

面向对象程序设计语言C#综合了VB简单的可视化操作和C++的高运行效率, 以其强大的操作能力、优雅的语法风格、创新的语言特性和便捷的面向组件编程的支持成为.NET开发的首选语言。

现在各大高校都开始了各种形式的C#程序设计课程, 由于C#的独特性, 传统的教学方式与方法明显不能满足C#教学的需求, 笔者根据近几年C#教学的经验, 在C#教学上做了一些研究, 供大家参考。

2、教学内容

教学内容的选取对面向对象程序设计语言C#的教学是非常重要的, 因为它决定了教学的质量。由于C#的独特性, 在教学内容的选取上面, 采用分阶段教学的方式, 将C#的学习分为两个阶段, 第一阶段为基础知识学习阶段, 第二阶段为系统设计阶段, 课程采用4节课为一个单元的方式, 每周8节课, 总课时为128节。具体课时和内容安排如下表所示:

3、教学方法与手段

针对教学的不同内容, 设计不同的教学方法。

在第一阶段, 因为是介绍C#的基础知识, 所以采用任务驱动式教学, 每一基础知识都对应一个小的任务。第二阶段, 采用项目教学方法, 在项目中讲解相关的知识点。

在C#教学过程中, 积极采用多种现代化的教学手段是提高教学质量的有效途径, 主要的教学手段有:

(1) 设计生动的教学多媒体课件。生动的课件可以营造轻松活泼的课堂气氛, 将抽象化的问题融入到学生熟悉的生活情境, 并通过动画演示等手段, 让学生通过对熟悉事物的认知来理解理论知识。

(2) 充分利用机房控制软件。由于C#教学都是采用一人一台电脑的方式教学, 所以要充分利用机房控制软件的互动功能, 让学生和老师能进行交互教学。

(3) 互联网交互学习。将课堂的教学延伸到课外, 可以建立一个C#学习QQ群, 教师与同学可以在课外进行交流, 学生之间也可以随时进行交流。还有就是建立C#学习的网站, 将学习的相关资料都放在上面, 方便学生查找资料, 自我学习。

4、考核方式

考核只是一种手段, 不是目的, 考核就是要检验一下学生的掌握情况, 针对C#教学的特殊性, 我们采用过程化考核方式, 学生的最后成绩主要由平时的程序完成情况来决定, 即总成绩=平时表现+任务完成成绩+阶段项目一成绩+阶段项目二成绩+课程设计成绩。这样, 学生改变了考试前"临时抱佛脚"的心态, 重视实验、重视平时表现。事实证明, 这种考核结果很大程度上解决了"高分低能"的问题。可以说C#成绩高的学生, 也是真正理解C#编程的学生。

5、结束语

C#作为一门面向对象编程语言, 具有很强的特殊性, 因此在教学中不能按照传统的方式进行教学, 需要不停进行教学改革, 摸索适合学生的一种模式, 这样才能真正让学生学得轻松, 教师教的轻松。

摘要:在面向对象程序设计语言C#的教学过程中, 如何选取教学内容, 采用何种教学方法和手段是非常重要的, 本文结合学生学习程序语言的特点, 根据本学院的教学情况, 对C#教学进行探讨, 交流了教学经验。

关键词:C#教学,面向对象,教学方法

参考文献

[1]谭恒松.C#程序设计与开发[M].北京:清华大学出版社, 2010.

[2]沈蕴梅.《C#程序设计》教学改革之初探[J].科技信息, 2009, (33)

[3]赵爱美.C#教学中的实践与探讨[J].电脑知识与技术 (学术交流) , 2007, (22)

C#语言教学 篇2

关键词:值类性;引用类型;值传递;引用传递

中图分类号:TP312文献标识码:A文章编号:1009-3044(2007)15-30749-02

Analyzing the Parameter Pass in C# Language

BAI Xue-bing

(Zhejiang Institute of Traffic, Hangzhou 311112, China)

Abstract: the article narrates the parameter pass in c# language, which includes number, array and object parameter pass, and it also tells the difference between the call by value and call by reference.

Key words: value type; reference type; call by value; call by reference

1 引言

目前,随着程序设计语言的不断发展,.NET平台在windows平台上已站稳脚跟,成为主流的开发平台,C#语言作为.Net平台的主流语言,重要性不言而喻。目前,C#语言已成为唯一能与Java抗衡的语言,而日益受到程序员的喜爱。

在C#程序设计中,常常会运用参数来传递对象,然而,在程序设计语言中,参数的传递常常使人含混不清,因此,有必要好好的分析一下参数的传递,才能使你在运用C#语言时更加的心应手。

首先,我们需要了解C#语言的数据类型,C#语言的数据类型可分为两大类:一种是值类性(value type),它的数据存放入栈内的一个变量之中。例如整型、浮点与结构体(int、double、struct)。另一种是引用类型(reference type),它的数据不驻留在栈中,而是存储在堆中。当访问一个具有引用类型的数据时,需要到栈中检查变量的内容,该变量引用堆中的一个实际数据。例如类,数组,字符串class,array,string)。由于这两种类型的数据在参数传递时是如此的不同,我们需要分别讨论。

2 值类型传递

在C#语言中参数的传递可分为值传递(call by value)与引用传递(call by reference),值传递中函数将参数复制到子程序的参数中。因此,改变子程序的参数不会影响用于调用的参数。而引用传递视将参数的引用传递给子程序。在子程序内部,该引用用来访问调用中的实际参数。

下面我们用例子来说明区别。引用传递在C#中使用关键字ref或out。

2.1 值传递

在给方法传递数值类型时,如int类型或double类型,它们是通过值传递。因此,在给这种类型进行值传递时,函数的调用并不会影响在主函数的原先的值。

示例如下。

using System;

class Test {

public void noChange(int i, int j) {

i = i + j;

j = -j;}}

class CallByValue {

public static void Main() {

Test ob = new Test();

int a = 15, b = 20;

Console.WriteLine("a and b before call: " + a + " " + b);

ob.noChange(a, b);

Console.WriteLine("a and b after call: " + a + " " + b);

}}

程序产生的结果如下:

A and b before call:15 20

A and b after call:15 20

由此可见,noChange()内部发生的操作不影响调用中的a和b的值。

2.2 引用传递

但是如果你在函数调用参数前使用ref参数,表示使用引用传递。

示例如下:

using System;

class Swap {

public void swap(ref int a, ref int b)//参数前加ref表示引用传递

{int t;

t = a;

a = b;

b = t; }}

class SwapDemo {

public static void Main() {

Swap ob = new Swap();

int x = 10, y = 20;

Console.WriteLine("x and y before call: " + x + " " + y);

ob.swap(ref x, ref y);

Console.WriteLine("x and y after call: " + x + " " + y); }}

程序产生的结果如下:

A and b before call:1020

A and b after call:2010

由此可见,swap函数()内部发生的操作影响调用中的a和b的值。如果不使用ref参数,a和b仍然不会变化。

3 引用类型参数传递

由于在C#程序设计中,类作为引用类型常常被使用。在参数的传递中,类的实例对象常常被用来作为函数参数,因此我们就以对象作为研究对象。另外我们也讨论一下数组。

3.1 对象值传递

由于对象本身即是引用。因此,当对象被用来当作参数传递时,对象本身是通过值传递,但是由于对象本身是引用传递,改变参数所引用的对象依然改变将影响参数所影响的对象。

示例如下

using System;

class Test {

public int a, b;

public Test(int i, int j) {

a = i;

b = j; }

public void change(Test ob) //调用test类对象ob 值调用

{ ob.a = ob.a + ob.b;

ob.b = -ob.b; }}

class CallByRef {

public static void Main() {

Test ob = new Test(15, 20);

Console.WriteLine("ob.a and ob.b before call: " + ob.a + " " + ob.b);

ob.change(ob);

Console.WriteLine("ob.a and ob.b after call: " + ob.a + " " + ob.b); }}

程序产生的结果如下:

A and b before call:15 20

A and b after call:35 -20

由此可见,尽管场change函数的参数test ob前没有加上ref关键字,但由于对象本身是引用 ,因此调用函数发生的操作仍然影响调用中的a和b的值。

3.2 对象引用传递

那么有些人就会问,如果在ob前加入ref的关键字会如何呢,答案是没有区别,因为对单一对象来说,引用的引用依然是引用。

但是涉及到两个对象以上时引用的引用就不一样了。

示例如下,假如我们将两个对象交换,会出现什么问题呢。

using System;

class RefSwap {

int a, b;

public RefSwap(int i, int j)

{a = i;

b = j; }

public void show() {

Console.WriteLine("a: {0}, b: {1}", a, b); }

public void swap(ref RefSwap ob1, ref RefSwap ob2)//对象前加有ref 表示引用的引用。

{ RefSwap t;

t = ob1;

ob1 = ob2;

ob2 = t;}}

class RefSwapDemo {

public static void Main() {

RefSwap x = new RefSwap(1, 2);

RefSwap y = new RefSwap(3, 4);

Console.Write("x before call: ");

x.show();

Console.Write("y before call: ");

y.show();

Console.WriteLine();

x.swap(ref x, ref y);

Console.Write("x after call: ");

x.show();

Console.Write("y after call: ");

y.show(); }}

程序产生的结果如下:

x before call:a:1,b:2

y before call:a:3,b:4

x after call:a:3,b:4

y after call:a:1,b:2

在这个例子中,方法swap交换两个传递给它的参数所引用的对象。调用之前,x对象引用包含值1与值2的对象,而y对象引用包含值3与之值4的对象。调用swap函数后,x引用包含值3与之值4的对象,而y引用包含值1与值2的对象。调用之后,两个对象的发生了交换。如果没有使用ref参数,那么swap函数内部的交换将不影响swap外部的内容,两个对象也就不会发生交换。如果从swap函数中删除ref,可以证明这一点。

3.3 数组参数的引用传递

数组对象由于本身为引用类型,在函数参数传递中数组也象对象一样采用引用调用。而且在C#语言中,如果在数组中使用不确定数量的数组参数传递,我们使用params关键字来解决该问题,这大大的提高了使用效率。

示例如下:

class Min {

public int minVal(params int[] nums) //参数采用数组,params表示参数不确定。

{int m;

if(nums.Length == 0)

{Console.WriteLine("Error: no arguments.");

return 0; }

m = nums[0];

for(int i=1; i < nums.Length; i++)

if(nums[i] < m) m = nums[i];

return m; }}

class ParamsDemo {

public static void Main() {

Min ob = new Min();

int min; int a = 10, b = 20; min = ob.minVal(a, b);

//求两个参数的最小值

Console.WriteLine("Minimum is " + min); min = ob.minVal(a, b, -1);//求三个参数的最小值

Console.WriteLine("Minimum is " + min); min = ob.minVal(18, 23, 3, 14, 25); //求五个参数的最小值

Console.WriteLine("Minimum is " + min); int[] args = { 45, 67, 34, 9, 112, 8 };// //求一个数组的最小值

min = ob.minVal(args);

Console.WriteLine("Minimum is " + min); }}

程序产生的结果如下:

Minimum is10

Minimum is-1

Minimum is 3

Minimum is 8

从以上程序可看出通过params关键字可以实现不确定数量的数组参数的传递。

4 总结

在C#程序设计中需要区分两种数据类型,值类型与引用类型,更要区分两种参数传递:值传递与引用传递。希望通过本文更好的掌握C#语言。

参考文献:

[1]Donis Marshall 著,许华杰,等译. Visual C# 2005 技术内幕[M]. 清华大学出版社,2007.1.

[2]Herbert Schidt 著,朱德爽,等译. C#完全手册[M]. 电子工业出版社,2002.8.

C#语言教学 篇3

1.1 需求分析

财务信息在经济与社会生活中的作用越来越大,财务分析的应用范围越来越广,社会实践中对财务分析方面人才的需求也越来越迫切。在证券市场上,国外早已存在财务分析师职业,而随着证券市场的发展,我国对财务分析师的需求也越来越大。目前,中国财务分析师存在着巨大的供需缺口,据有关人士预测,未来3年对CFA的需求量达近万人。

1.2 实践教学挑战

财务分析课程,是一门实践性要求很强的课程,从财务分析实践来看,几乎所有企业都进行财务分析,设有财务分析岗位,而我国高等教育中财务分析课程的教学普遍比较薄弱,因此,财务分析课程的教学改革和应用实践面临着来自社会需求的日益紧迫的挑战。

开发辅助教学的财务分析软件有着现实的需求通常情况下,学校可以建立一定的实验实训环境,利用一些软件工具进行财务建模、财务分析和财务决策,让学生在动手实践环境中发现问题、提出问题和解决问题,从而培养学生解决实际问题的能力。

2 主要功能

2.1 生成财务报表

本软件可以根据数据库中的原始财务数据自动生成新会计准则下的3张报表:资产负债表、利润表和现金流量表,并可针对报表中的会计科目绘制出历史曲线。

进行单项财务分析本软件根据企业财务数据,可对其进行3大能力分析,具体有:盈利能力(包括营业盈利能力、资产盈利能力和资本盈利能力)分析、营运能力(包括流动资产营运能力、固定资产营运能力和总资产营运能力)分析、偿债能力(包括短期偿债能力和长期偿债能力)分析。

2.2 进行综合财务分析

本软件根据企业财务数据,对企业进行综合分析,具体方法是沃尔评分法和杜邦财务分析法。

3 体系结构

本软件采用C/S结构,其中操作系统选择Windows Server2003企业版,数据库服务器选择Microsoft SQL Server 2005,开发平台选择Microsoft Visual Studio 2008,开发语言为C#。下面介绍本软件的体系结构。

3.1 后台数据库

本软件后台数据库设计了corporation、balance、profit和cash4张表,用于存储公司的财务报表数据,作为软件的原始数据源。

3.1.1 corporation表

本表用于存储企业的基本信息,其结构包括“证券代码”、“证券简称”、“公司名称”和“公司概况”列,其中,“证券代码”为主键列。

3.1.2 balance表

本表即资产负债表,用于存储资产负债表中的各科目,不过需要确定表的主键列,此处设计一个复合主键,即由“证券代码”、“年份”和“类型”这3个列来充当主键,其中,“证券代码”用于存储上市公司的股票代码,“年份”用于存储财务报表描述的年份,“类型”合法值为1~4,分别代表一季报、半年报、三季报和年报4种报表类型,其余列均为money类型,且允许空,它们包括“货币资金”、“交易性金融资产”、“应收票据”、“应收账款”等,共计47列。

3.1.3 profit表

本表即利润表,主要用来存储利润表中的各科目,其主键及列设计同balance表,表结构包括“证券代码”、“年份”、“类型”、“营业收入”、“营业成本”、“营业税金及附加”、“销售费用”、“管理费用”、“财务费用”等,共计18列。

3.1.4 cash表

本表即现金流量表,用来存储现金流量表中的各科目,其主键及列设计同balance表,表结构包括“证券代码”、“年份”、“类型”、“销售商品_提供劳务收到的现金”、“收到的税费返还”、“收到其他与经营活动有关的现金”、“经营活动现金流入小计”、“购买商品_接受劳务支付的现金”、“支付给职工以及为职工支付的现金”、“支付的各项税费”等,共计35列。

3.2 功能设计

本软件的主要功能包括数据录入功能、财务报表功能、财务单项分析功能和财务综合分析功能。

3.2.1 数据录入功能

财务报表数据需要录入后台数据库,下面设计并实现数据录入功能。

(1)设计XML文件存储数据库结构.

针对数据库中的3个财务报表,分别设计相应的XML文件,这是为了解决表字段与程序界面显示字段不一致问题,在XML文件中同时存储列名与其显示列名。以balance.xml文件为例,结构如下所示:

<资产负债表>

<流动资产Caption="一、流动资产">

<货币资金Caption="货币资金">

<交易性金融资产Caption="交易性金融资产">

<应收票据Caption="应收票据">

<其他流动资产Caption="其他流动资产">

<流动资产合计Caption="流动资产合计">

在上述文件中,Caption属性即为程序界面显示列名。

(2)编写ReadXML方法读取XML文件。

通过DOM模型对XML文件进行读取,其编程步骤如下:

1)创建XML文件读取器

.NET框架中的XmlTextReader类用于创建对XML数据进行快速、非缓存、只进访问的读取器,代码如下:

通过上述几个步骤,即可读取XML文件。

(3)输入数据并插入数据库

数据的录入通过DataGridView控件,然后通过ADO.NET编程,将数据存入表中。

3.2.2 财务报表功能

财务报表包括资产负债表、利润表和现金流量表,报表格式需符合新会计准则要求,软件需要显示企业不同时期的报表数据,并能绘制出同一会计科目的历史曲线,曲线绘制通过Software FX公司的Chart控件完成。

3.2.3 财务分析功能

财务分析包括盈利能力分析、营运能力分析和偿债能力分析,每种分析包含很多指标,每个指标有不同的计算公式,软件需要计算企业不同时期的指标并绘制出历史曲线。

3.2.4 综合分析功能

企业财务状况综合评价模型,本软件实现了两个:沃尔比重评分法和杜邦财务分析法。其中沃尔比重评分法将选定的财务比率用线性关系结合起来,并分别给定各自的分数比重,然后通过与标准比率进行比较,确定各项指标的得分及总体指标的累计分数,从而对企业的信用水平作出评价。杜邦财务分析法是将企业净资产收益率逐级分解为多项财务比率乘积,从而深入分析比较企业的经营业绩。软件需要根据上述两种方法对企业的财务状况进行综合分析。

4 结语

可根据企业财务报表数据,对企业财务状况进行单项分析和综合分析,既可用于高校财务分析课程的辅助教学,又可用于有关企业和个人分析企业财务状况。

摘要:通过C#语言开发财务分析教学软件的背景,阐述软件的主要功能和体系结构,重点剖析后台数据库设计和数据录入功能的实现原理,并结合图片给出了财务报表功能和财务分析功能的实现思路,上述研究成果对高等院校财务分析课程教学和有关人员进行企业财务分析具有较高的实用价值。

关键词:.NET,财务分析,XML,教学

参考文献

[1]李继武.C#语言程序设计.北京:清华大学出版社,2011.

[2]池国华.财务报表分析.北京:清华大学出版社,2008.

C#语言教学 篇4

关键词:微课;中职学校;C#课程教学

中图分类号:G71 文献标识码:A 文章编号:1673-9132(2016)12-0350-19

一、微课提出的背景

微课在中国的流行起源于微博,兴起之后以其短小精悍、传播迅速的特点受到了国内学者的关注,围绕“微课”这一概念的研究也随之应运而生。在当今社会,微博微信成为了主流的沟通方式,各种微电影、微小说、微店如雨后春笋般出现在了我们的周围,可以说是到了一个“微”时代。在教育领域也在发生着类似的变化,近年来慕课、微课、翻转课堂等名词不断出现在我们课程改革的过程中。

微课,最早起源于美国新墨西哥州圣胡安学院的David Penrose提出的微课程,在我国对于这个概念的定义笔者比较认同广东省佛山市胡铁生教师的说法:“微课又名微课程,它是以微型教学视频为主要载体,针对某个学科知识点(如重点、难点、疑点、考点等)或教学环节(如学习活动、主题、实验、任务等)而设计开发的一种情景化、支持多种学习方式的新型在线网络视频课程。”在这个概念中从课程形式、课程结构、表现方法、组织方式等角度进行了阐述,让我们对微课有了一个全方位的了解。

二、微课在中职学校的发展现状

微课的提出是对传统课堂教学的一种改革,在其发展的过程中必然会遇到不少阻力。传统的课堂教学是在教室或者实训室,在一节课中将需要教授的知识点进行讲授、示范和练习;而微课却是把知识点用一个3-10分钟的视频来录制好之后,放到一个公共平台去让学生自主学习,不限时间和地点,让习惯了传统教学的教师感到不太适应和不理解。这需要我们教师用创新的眼光去接受这种新型教学方式,尤其是在课堂内容的编排上要与制作的微课相配合。

中职学校的学生对学习缺乏热情,有研究调查表明中职学生在学习上的注意力集中时间普遍在8-15分钟,如何有效地利用这一段时间来提高学生的学习效率呢?微课就很好地解决了这个问题。教师将需要教授的知识点录制成微课,让学生能在课上课下利用移动终端自主学习,教师就能够利用学生的注意力集中时间来进行教学,从而提高学生整体的学习效率。

三、中职课堂微课的设计

在中职课堂上如何进行微课设计呢?

1.微课内容的选择。中职学生在学习理论知识的能力上比较薄弱,在微课内容的选择上应该重在应用技术,突出实践,选择以任务为中心的课程内容比较合适。

2.在微课中教学方法的应用。教学方法应该灵活多变,尽量吸引学生的注意力,激发学生的学习兴趣。

3.在微课内容的难度上要把握好,不能过难或者过于难理解,这样会让学生产生无从下手的感觉,从而产生挫败感。

四、微课在中职C#课程教学中的应用

我近年来主要从事C#课程教学,在此以C#课程为例来谈谈微课的应用。C#是一门计算机编程课,内容涵盖基础理论、Window程序设计、Web程序设计等。对于基础理论部分,可以充分利用微课进行教学。在学习C#课程之前学生已经学习过C语言程序设计这门课,两门课的基础理论部分有较多地方都很相似。

在此基础上,笔者将一些知识录制成了微课视频,比如数据类型、条件语句、循环结构等。在微课视频的制作上采用了拍摄制作法、录屏制作法、动画制作法。

1.拍摄制作法。主要是制作者利用摄像设备,在一定授课环境中,对教师讲课内容或学生学习过程进行记录制作微课。这类微课的最大特点在于教师要出镜授课,这对教师提出了比较严格的要求,不但教学内容要组织得好,还要注意一些神态、表情、动作等对学生的影响。这种微课一般在屏幕上同时呈现教师和课件,比较适用于条件语句等讲解、举例相结合的知识。

2.录屏制作法。制作者在计算机中安装录屏软件(如Camtasia Studio),录制教师通过教学课件(如PPT课件)呈现的教学过程,并同时录制教师的声音和屏幕操作行为生成的微课视频。这种微课对教师的技术要求较低,只需要掌握录屏软件的使用就可以。视频画面主要是PPT课件,因此对PPT制作的要求较高,需要制作得美观、图文并茂,要不然学生很容易失去学习兴趣。这种微课适合需要较长篇幅文字展示或者需要展示紧密逻辑关系的知识点,比如C#中对各种数据类型的定义的讲解。

3.动画制作法。利用flash动画技术制作的微课,它的最大的特征是趣味性和可操作性。它能够有效帮助学生在学习过程中理解需要空间想象的知识点,另外一些不便于真人演示和实物展示的知识点也同样适用。比如在C#中讲解循环结构时展示循环结构的过程,就可以利用动画微课来进行展现。

五、结语

目前,国内已经掀起了一股“微课”热潮。一方面我们应该以冷静客观的态度去看待它。另一方面,我们更需要以科学的态度和饱满的热情去探索它。“微时代”的到来将会对教育理念、教育内容、教育方法和教育手段等方面产生根本性变革。这些年来,我国教育教学的改革不断深化,微课在教育改革中取得了非常不错的实践成绩。微课作为一种新型的教育教学模式、教学资源,与教育实践的发展需求仍然有一些差距,但是作为一种新兴的教育教学形态,微课有着远远超过其他的教育形式的巨大潜力。这将有待我们不断去实践和完善,让微课成为一种提高教学效果的有效工具。

参考文献:

[1] 胡铁生,黄明燕,李民.我国微课发展的三个阶段及其启示[J].远程教育杂志,2013(4).

[2] 张慧勤.录屏式微课的制作与应用初探[J].教育信息技术,2012 (11).

[3] 朱琦,李兆君.大学英语课程微型学习的内容选择和活动设计[J].现代教育技术,2012(8).

浅论C#语言中指针的使用 篇5

尽管实际上对C或C++中的每种指针类型构造,C#都设置了与之对应的引用类型,但仍然会有一些场合需要访问指针类型。例如,大规模的运算中使用指针来提高性能,当需要与基础操作系统进行交互、访问内存映射设备,或实现一些以时间为关键的算法时,若没有访问指针的手段,就不可能或者至少很难完成。为了满足这样的需求,C#提供了编写不安全代码(unsafe code)的能力,在不安全代码中,可以声明和操作指针。由于这块知识内容介绍的比较少,基于此,本文简要分析并介绍C#语言中如何使用指针。

1 C#中指针基本使用介绍

1.1 不安全代码

C#语言中引入不安全权代码(unsafe code)的功能,即在C#代码中使用unsafe关键字声明部分代码为不安全上下文代码,在被声明的不安全上下文中,可以声明和操作指针,这样可以在C#程序中就像编写C代码一样使用指针。但无论如何,不安全代码事实上都是一种“安全”功能,程序的执行将不会在不受信任的环境中执行不安全代码。

C#不安全上下文是指在C#程序中使用关键字unsafe声明类型或类型的成员,则该类型整个文本范围或类型的成员的整个文本范围称为不安全上下文;再或者某个大括号括起来的程序块之前使用unsafe定义,则整个块的文本范围也被称为不安全上下文。在以上不安全上下文中就可以轻松声明和使用指针。如下三段使用了指针的代码都是不安全上下文:

1.2 指针类型

1.2.1 指针类型概述

在C#语法中,数据类型主要有数值类型和引用类型,但在C#不安全上下文中,还可以包含另一种类型,即指针类型,该类型和C/C++语言指针一样,用来存储其他变量地址的特殊的数据类型,在此其他变量的数据类型简称目标类型,该指针的目标类型规定不允许是指向引用类型或者包含引用类型的结构体,指针的目标类型必须是下列数据类型之一:整数类型sbyte,byte,short,ushort,int uint,long,ulong;浮点类型double,float;小数类型decimal;字符类型char;布尔类型bool;枚举类型enum;嵌套的指针类型以及空类型void;以及不包括引用类型的结构体,如:char*,int*,byte*,int*[],void*。值得注意的是,和C/C++定义指针略有不同,指针间接寻址运算符“*”连着目标类型写,而不像C/C++作为指针名称的前缀标点符号。如:C/C++中定义指针int*p1,*p2;,而在C#中如下定义指针int*p1,p2;显然指针p1,p2存储的是整数int类型某个变量数据的存储地址。

1.2.2 指针类型运算

在C#不安全上下文中,主要指针运算有如下几种:指针间接寻址,获取变量的地址,通过指针访问结构的成员,索引指针元素,递增和递减指针,指针算术运算,指针比较等,下面分别具体介绍指针运算。

1.2.2. 1 指针间接寻址

指针间接寻址运算符为星号*,通过运算符*用来指针间接寻址并且用于获取指针所指向的变量。例如定义指针int*p1;则表达式*p1计算的结果是根据指针p1的值(地址值),间接寻址,指向类型为int类型的变量值。

1.2.2. 2 获取变量的地址

获取变量的地址运算符为&,通过运算符&用来获取紧跟&后面的变量的地址值。例如代码

在该例中我们创建了2个变量p1及x,p1是指向int的指针,x是int变量并被初始化值123,然后我们通过运算符&获取变量x的地址,并把该地址赋给用于存储地址值的指针变量p1,如此,指针p1和变量x建立了一定的关联,若变量x的值被修改,相应的p1不会改变,但表达式*p1却会随着x的值同时被改变。

1.2.2. 3 通过指针访问结构体的成员

当定义的结构体类型所有成员都为非引用类型,且定义的指针指向该结构体类型对象时,则通过指针访问该结构体对象成员时可以采用如下操作符号->,即p1->x,此处p1被定义为指向某个结构体类型对象的指针,x为该结构体成员之一。

例如代码:

上述代码p1->age还可以通过(*p1).age的方式来访问结构体的成员,其意义是等价的。

1.2.2. 4 索引指针元素

索引指针元素是指当指针被定义为指向动态内存分配的数组时,可以采用类似于数组元素访问的方式来索引指针元素,即p1[i]来索引位置在第i位的指针元素。

此处p1[i]还可以采用*(p1+i)的方式来索引指针元素,其意义是等价的。

1.2.2. 5 递增和递减指针

指针递增和递减运算符号和其他变量递增和递减运算符号一样,即++,--,可以应用于除void*以外的所有类型的指针变量.++运算符将该指针变量的地址加上一个指针指向类型的字节长度值,而--运算符则将该指针变量的地址减去一个指针指向类型的字节长度值。

1.2.2. 6 指针算术运算

指针算术运算主要包括除void*以外的所有同类型指针之间的加减运算或者是指针与类型为int、uint、long或ulong的表达式之间的加减运算。同类型指针之间的加减运算得到的结果是一个结果为long的整数值。例如int*a=stackalloc int[10];int*p1=&a[1];int*p2=&a[6];System.Consolw.WriteLine(“p2-p1={0}”,p2-p1);得到类型为long的数值5.指针同整数类型(int、uint、long或ulong)的运算得到的结果还是一个同类型的指针(地址值有所改变)。例如int*p1;p1=p1+5;则p1的值就是在原来的地址上增加五个int数据类型的字节数,减法就相反,减去相应数量的数据类型字节数。

1.2.2. 7 指针比较

关系比较运算符==、!=、<、>、<=和>=可用于所以指针类型的比较,比较的对象是指针(地址值),就像比较两个无符号整数一样,得到的值为bool类型的逻辑值。

2 C#中指针其他内容介绍

2.1 fixed语句

在C#不安全上下文中使用指针,特别是要给变量取地址赋值给某个指针时,一般我们采用运算符号&来操作,但有的时候,因为受到C#语言.NET运行机制垃圾回收器的影响(即内存资源有限,变量或对象在不被占有或不使用时将被摧毁,垃圾回收器回收相应内存空间),垃圾回收器在清理的过程中,会改变对象(变量)的物理内存位置,这样对象的位置指针将指向错误的内存位置,为了避免这样的问题,C#使用fixed关键字,该语句用于“固定”可移动变量,从而使该变量的地址在语句的持续时间内保持不变。fixed语句可以用于固定并获取静态字段的地址,对象的实例字段地址,数组元素的地址等等,fixed语句将保证包含该语句的生存期内相关地址不会被重定位或者释放。

2.2 固定大小缓冲区

在C#不安全上下文中,固定大小缓冲区仅允许在结构体声明中声明,并作为结构体成员之一,表示给定类型的变量的固定长度缓冲区的存储区,也可以理解为把固定数组元素个数的某类型数组作为结构体成员。在声明固定大小缓冲区时,给定的缓冲区元素类型只能是sbyte、byte、short、ushort、int、uint、long、ulong、char、float、double或bool。例如unsafe struct St{public fixed int a[20];}。固定大小缓冲区的元素保证像C语言数组一样在内存中按顺序放置,一般情况下,固定大小缓冲区的初始内容未定义。在操作时把结构体对象成员即固定大小缓冲区赋值给和固定大小缓冲区元素同类型的指针变量进行处理。

2.3 在堆栈上分配内存及动态内存分配

在C#.Net中,根据变量的数据类型不同,有两种内存分配类型:堆栈内存和堆内存。变量的内存空间可能是基于堆栈分配的,也可能是基于堆分配的。当我们定义局部变量声明时,编译器分配一小块叫做堆栈的内存,堆栈负责保持跟踪应用程序运行需要的内存,当我们再次声明某个局部变量时,此时分配的内存将会叠放在前一个内存分配顶部的,你可以将堆栈理解为一系列隔间或盒子(内存)的逐层堆积。内存分配和解除分配使用LIFO(Last in first out,后进先出)逻辑,也说就是在内存的末尾(如堆栈的顶部)分配和解除分配的,当我们创建一个类的对象时,此时将在刚才的堆栈上创建一个指针,真实的对象是存储在一个不同类型的内存分配(叫做堆)中,堆不会跟踪运行的内存,它只是对象的堆积,堆用于动态内存分配。当执行完最后一行代码方法返回,结束控制时就自动会清除分配到堆栈上的所有内存变量,按照LIFO方式从堆栈中解除内存分配,但存储对象的堆内存需要垃圾回收器解除。也就是说无法显式释放利用stackalloc动态分配的堆内存,但在函数成员的执行期间创建的所有堆栈分配内存块都将在该函数成员返回时会自动丢弃。

3 结束语

VS.NET中默认的配置是不支持不安全代码的,如果我们想使用指针就要修改这个默认的设置,即在配置属性—生成-允许不安全代码块设置为true,否则在编译的时会出现“不安全代码只会在使用/unsafe编译的情况下出现”的编译错误.

本文概要性地介绍了在C#语言中指针的基本使用以及一些指针的基本概念,一般而言C#编码不太会用到指针,但是当程序中大规模的运算需要使用指针来提高性能,或者当需要与基础操作系统进行交互、访问内存映射设备时,我们就绕不开指针的应用。

摘要:该文介绍了C#语言中通过unsafe关键字声明不安全上下文代码来定义和使用指针,概要介绍了C#中指针的概念以及在C#中指针类型的运算,最后初步分析了C#中指针的一些其他操作和应用。

关键词:C#,不安全代码,指针,指针运算

参考文献

[1]施燕妹.C#语言程序设计教程[M].北京:中国水利水电出版社,2004.

[2]谭浩强.C语言程序设计[M].北京:清华大学出版社,2000.

C#语言开发俄罗斯方块游戏 篇6

俄罗斯方块游戏是一种大家较为熟悉的游戏, 通常有7种方块模型, 可以控制它的平移、加速、旋转变形 (7种模型共计19种状态) 。另外, 左右平移和变形需要考虑边界碰撞的问题, 下移需要考虑堆积和消层的问题。

2 设计思路

利用C#语言开发了俄罗斯方块游戏, 如图1所示, 设计中借鉴了MVC的设计思路, 除了窗口界面类外设计了3个类:

一是模型类 (CakeMode) , 功能为实现模型的构造 (CakeMode (int_mode) ) , 获取方块移动后的位置 (Point[]CakeMove (int n) ) , 获取方块旋转变形后的位置 (Point[]CakeChange () ) 。

二是游戏规则类 (Rule) , 功能为判断方块移动后的位置是否超出边界 (bool MoveStop (Point[]ArryMveNext, int n) ) , 判断方块旋转变形后的位置是否超出边界 (bool ChangeStop (Point[]ArryChgNext) ) , 去除已添满的行并加分 (void RefurbishRow (int Max, int Min) ) 。

三是画图类 (Draw) , 功能为绘制方块的各个子方块 (void DrawCake (Point[]ArryPoi, Color color) ) , 清空当前方块的区域 (void CakeDelete (Point[]ArryPoi) ) , 清空游戏背景 (void BackgroundClear () ) , 重绘游戏背景上的方块 (void DrawBackground () ) 。

该方法通过模型、控制、视图相分离, 使程序流程更加清晰, 并且具有强内聚, 松耦合特性, 使功能扩展更加方便。该方法对于开发GDI+游戏有很好的借鉴作用。

3 实现代码

3.1 窗口界面类

3.2 CakeMode类

3.3 Rule类

3.4 Draw类

4 结语

C#语言教学 篇7

前段时间, 进行数据恢复软件开发, 需要将保存在磁盘上的二进制文件数据, 按照不同的文件格式, 进行相应的文档 (数据) 恢复。数据恢复时, 如果数据区的数据连续并且没有破坏, 则恢复文件比较容易;如果数据区的数据损坏, 恢复文件就十分困难。Word文档由系统产生的标准格式控制数据和用户数据组成, 不同版本的Word文档, 例如Word97、Word2003、Word2007、Word2010等, 系统产生的标准格式控制数据和编码方式都不同。该工程实例采用作者在进行数据恢复时开发的Read Word Text Class.dll动态链接库, 进行软件设计, 实现了从Word97、Word2003文档中提取文本。为了检验该工具软件的实际效果, 与国外专业的从Word文档中提取文本的工具软件作了测试比较, 测试结果:从Word文档中提取文本工具软件性能优于专业软件。

2 Read Word Text Class.dll动态链接库函数

(1) 获得Word97文档第一段文本:

(2) 获得Word2003文档第一段文本:

(3) 获得Word文档文本:

(4) 连续获得Word文档文本:

3 实现代码 (软件开发平台C#2008)

(1) 新建一个Windows窗体应用程序工程。在Form1窗体上分别放入控件progress Bar1、rich Text Box1、menu Strip1、open File Dialog1、timer1、save File Dialog1, 在工程目录下拷入文件Read Word Text Class.dll。

(2) 添加引用。在解决方案资源管理器中添加引用ReadWordTextClass.dll。

(3) 文件菜单。选中menu Strip1, 设置文本为“文件”, 在“文件”下分别创建子菜单“打开*.doc文件”、“保存为rtf文件格式”、“保存为txt文件格式”。

(4) 在Form1.CS文件中添加引用:

(5) 在Form1中添加下列语句和函数:

(6) 打开*.doc文件菜单事件代码:

(7) 保存为rtf文件格式菜单事件代码:

(8) 保存为txt文件格式菜单事件代码:

4 以Word2003文档为例测试

(1) Word2003文档正常情况测试 (信息化战争.doc)

图1是该工具软件测试Word2003文档正常时能够提取Word文本。

图2是国外专业软件测试Word2003文档正常时能够提取Word文本。

(2) Word2003文档损坏情况测试 (Bad_信息化战争.doc)

图3是该工具软件测试Word2003文档损坏时仍然能够提取Word文本。

图4是国外专业软件测试Word2003文档损坏时不能提取Word文本。

5 结语

C#语言教学 篇8

.NET框架是微软新一代视窗服务体系的核心, C#语言是.NET框架提供的开发语言的一种, 是惟一专门为.NET框架设计的语言。C#语言从C和C++语言演化而来的, 有着广泛的应用基础, 随着微软的.NET框架的逐渐流行, C#语言成为移植到其他操作系统上的.NET版本中使用的主要语言。

应用C#语言开发的各类应用程序经常需要某种形式的数据库访问。Oracle数据库是大型关系型数据库, 拥有强大的功能, 具有广泛的应用基础和前景。所以使用C#开发的应用程序经常会选择Oracle数据库作为数据支撑, 所以探讨C#语言与Oracle数据库的接口有着重要的应用价值。

一、接口的基本理论

软件接口技术是指不同类型的软件在同一环境下彼此之间进行的程序模块调用、参数传递、数据共享、功能等相互支持与补充的方式与技术。C#语言与Oracle数据库的接口是指使用C#语言编程的应用程序对Oracle数据库的数据调用、数据更改等操作的支持技术。

ADO.NET是C#用于以关系型的、面向表的格式访问数据的一种模式, 它不仅能够指向数据源, 还能实现其它数据格式的访问。ADO.NET支持两种数据操作模式。一种是通过管理提供者类直接与数据库交互;另一种是断开方式, 通过驻留在内存中的数据集对数据库进行操作, 最后再实现连接同步。

二、.NET框架中与接口相关的数据类型或变量:

总的来说, .NET框架中与接口相关的数据类型包括了数据管理提供者类对象和数据库用户类对象两种。

2.1 数据库管理提供者类对象

.NET框架包括了四种数据提供者, 分别用于不同的数据库标准。SQL Server.NET提供者、Oracle.NET提供者、OLE DB.NET提供者、ODBC.NET提供者, 分别用于不同的数据库标准。对于每种数据提供者, 包括了如下对象。

(1) 数据库连接对象

数据库连接对象是一个与数据库进行连接的对象, 包含着与数据源创建连接的信息。用于SQL Server.NET提供者的数据库连接对象是SQl Connection, 用于Oracle.NET提供者的数据库连接对象就是Oracle Connection, 用于OLE DB.NET提供者的数据库连接对象就是Ole Db Connection, 用于O D B C.N E T提供者的数据库连接对象就是ODBCConnection。

(2) 数据库命令对象

此对象用于对数据源发出命令, 对于不同的数据提供者, 该对象的名称也不同, 用于Oracle.NET提供者的命令对象是Oracle Command。

(3) 命令构造对象

此对象用于构建SQL命令, 在基于单一表查询的对象中进行数据修改, 用于Oracle.NET提供者的命令对象是Oracle Commandbuilder。

(4) 数据读取对象

专门用于读取数据。用于Oracle.NET提供者的数据读取对象是Oracle Datareader。

(5) 数据适配器对象

该对象取得数据并且在数据与数据集之间建立的一座桥梁。用于Oracle.NET提供者的数据读取对象是Oracle Data Adpter。

2.2 数据库用户对象

数据库用户对象用于定义ADO.NET断开的客户端对象。

(1) 数据集对象

数据集是数据的内存驻留形式, 它提供了独立于数据源的一致关系编成模型。此对象表示一组相关表, 在应用程序中这些表作为一个单元来引用。

(2) 数据表对象

数据表对象代表数据集中的一个表, 此对象允许访问其中的行与列, 即Data Column对象和Data Row对象。

(3) 数据关系对象

数据关系对象代表通过共享列而发生关系的两个表之间的关系。

(4) 数据源对象

数据源是一个数据库的名字, 表示程序要连接的数据库对象。

三、具体实现的方法步骤:

第一步:正确安装和配置Oracle客户端软件

要实现Oracle客户端与服务器的连通, 客户端需要安装两个软件:一是数据供应程序 (即ODP.NET工具) , 另一个是Oracle客户端连通性软件。微软提供的数据供应程序包含在.NET框架中, 客户端正确安装.NET框架后不需要单独下载或安装, 而Oracle客户端软件需要单独下载安装。当客户端安装好这两个软件后, 可以通过客户端使用SQL*Plus确认连通性, 如果能够与Oracle数据库相连, 那么证明客户端已经正确地安装和配置了Oracle客户端软件。

第二步:添加引用

ADO.NET附带了4个数据库客户命名空间, 分别用于SQL Server、Oracle、ODBC数据源和通过OLEBC实现的数据库。

1. 添加引用

添加一个指到数据驱动程序的引用。具体方法是在解决方案内, 选择“引用”节点, 右键单击并选择“添加引用”, 在系统弹出的添加引用对话框列表中选择System.Data.Oracle Client。

2. 添加C#的using语句

在添加引用之后, 在代码文件的顶部的命名空间或类声明之前添加C#的using语句, 虽然从技术上来说不是必须的, 但这样做的好处是我们不再需要使用冗长的完整名称来引用数据库对象。语句为:

第三步:建立应用程序和Oracle数据库的连接

1.确定连接字符串和对象

Oracle连接字符串和Oracle名称解析是不可分的。假定我们在Oracle tnsnames.ora文件中定义了一个数据库别名Ora Db, 如下:

要使用上面所述的在tnsnames.ora文件中定义的My Db别名, 需要使用以下语法:

第四步:关联连接字符串与连接对象

通过将连接字符串传递给连接对象的构造器, 连接字符串与连接对象建立关联。语法如下:

第五步:打开数据库

在连接字符串与连接对象建立关联之后, 使用Open方法来创建实际的连接。

oracle_conn.Open () ;

第六步:应用Oracle Command对象发送命令

第七步:对命令对象发送操作指令, 执行SQL命令

执行SQL命令有返回标量值和不返回标量值两种情况。从数据库中检索数据可以通过实例化一个Data Reader对象并使用Execute Scalar或Execute Reader方法来实现。在下面这个简化的例子中, Data Reader的返回值是一个字符串, 它用来设置标签控件的文本的属性值。

类似INSERT、UPDATE和DELETE等的数据修改操作不检索数据, 可以使用Execute Non Query方法实现。

第八步:关闭数据库

可以调用连接对象的Close方法或Dispose方法来关闭到数据库的连接。Dispose方法调用Close方法。

四、应用实例

4.1 设计思路

本实例将建立一个题库数据库管理系统, 实现题目的浏览、增加、修改和删除功能。

首先在服务器端新建一个方案test并且建立一个数据表question, 此表包含question (问题) 、answer (答案) 、difficulty (难度) 、mark (分值) 、type (题型) 等字段。然后在客户端安装.NET框架和Oracle客户端连通性软件后, 建立一个新项目, 选择C#语言作为开发语言, 选择windows应用程序模板, 项目名称取为My Try。在该项目下新建一个窗体Frm_manage, 在窗体内添加两个testbox分别命名为testbox1、testbox2用来显示题库中题目和答案的内容, 添加三个listbox分别命名为listbox_type、listbox_mark、listbox_hard用来显示题型、分值和难度, 添加三个button按钮分别命名为button_add、button_delete、button_Modify用来触发增加题目、删除题目和修改题目等事件, 如图1。

3.2核心代码

四、总结

本文阐述了C#语言与Oracle数据库的接口方法与接口步骤, 对使用C#语言开发的应用程序对Oracle数据库的访问有指导作用。

参考文献

[1]路川、胡新杰等.Oracle10g宝典.-北京:电子工业出版社, 2006.1

[2] (美) 沃森 (Waston, K.) , (美) 内格尔 (Nagel, C.) 等著, 齐立波翻译.C#入门经典.-北京:清华大学出版社, 2006.5

[3]刘秋香、张永胜等.C#下利用ADO.NET访问SQL Server技术.计算机应用, 2004.11

C#语言教学 篇9

本文下面将详细剖析在.NET平台下用C#语言实现登录验证码的机理。

一、创建图像及其绘图表面

在.NET平台下创建图像要用到Bitmap类, 而在图像上绘制形状和线条则要创建该图像的绘图表面, 这要用到Graphics类。

Bitmap类封装了GDI+位图, 用于处理由像素数据定义的图像, 它继承自抽象基类Image, 通过其构造函数可创建图像, 构造函数原型如下:

其中, width为以像素为单位的新图像的宽度, height为以像素为单位的新图像的高度。

Graphics类封装了GDI+绘图表面, 它提供了在图像上绘制形状和线条的方法, 可从指定的图像创建Graphics对象。

主要代码如下:

其中, From Image方法从指定的Image创建新的Graphics对象。

二、绘制背景干扰线

在图像背景上绘制的干扰线, 其起点和终点坐标将是随机的, 这要用到Random类, 该类的Next方法将返回一个小于所指定最大值的非负随机数。Graphics对象的Draw Line方法用来绘制干扰线。

主要代码如下:

其中, thePen为绘制线条的笔, 它确定线条的颜色、宽度和样式;point1为线条的起点, 其x坐标和y坐标为随机生成的x1和y1;point2为线条的终点, 其x坐标和y坐标为随机生成的x2和y2。

为了增加识别难度, 可将上述代码放入一个循环中来绘制多条干扰线。

三、绘制验证码

要在图像上绘制验证码, 首先要定义候选验证码字符集, 然后在其中随机选取若干个作为验证码。候选验证码字符集可用一个字符数组来实现, 具体元素则由程序员自行定义, 比如定义如下验证码数组:

从上述字符数组中随机选取若干个 (比如4个) 字符, 构建验证码字符串, 主要代码如下:

要将验证码字符串绘制到图像上, 还需确定字体和画刷, 字体要使用Font类, 其构造函数原型如下:

其中, family Name为新字体的Font Family的字符串表示形式;em Size为新字体的大小, 以磅值为单位;style为新字体的风格。

画刷可考虑采用线性渐变画刷Linear Gradient Brush类, 这有利于增加认证码的识别难度, 该类的构造函数原型如下:

其中, rect为线性渐变的界限;color1为线性渐变起始色;color2为线性渐变结束色;angle为线性渐变角度, 从x轴以顺时针角度计算。

绘制验证码的主要代码如下:

四、绘制前景噪声点及图像边界

为了增加认证码的识别难度, 可在图像上绘制若干噪声点 (比如40个) , 其中噪声点的坐标和颜色均随机产生。指定像素颜色要使用Bitmap类的Set Pixel方法, 其函数原型如下:

其中, x和y为要设置的像素的坐标, color为要设置的像素的颜色。

绘制噪声点的主要代码如下:

噪声点绘制完后, 再绘制图像的边界, 整个认证码图像就绘制完成了。绘制图像边界要使用Graphics类的Draw Rectangle方法, 其原型如下:

其中, pen为绘制矩形的笔, 它确定笔的颜色、宽度和样式;x为要绘制的矩形左上角的x坐标;y为要绘制的矩形左上角的y坐标;width为要绘制的矩形的宽度;height为要绘制的矩形的高度。

具体代码如下:

五、保存图像至内存流

绘制好的图像还需要保存至内存流, 才能被使用, 这要用到Bitmap类的Save方法, 其原型如下:

其中, stream为将在其中保存图像的流;format为保存图像的格式。具体代码如下:

上述代码中, ms为保存图像的内存流;Gif为保存的图像格式。有了图像内存流, 就可以将其方便地应用在网页验证码功能中了。

摘要:本文详细剖析了在.NET平台下利用C#语言创建验证码图像的编程机理, 主要包括创建图像及其绘图表面、绘制背景干扰线、验证码、前景噪声点和图像边界等内容, 最后给出了图像保存至内存流的方法, 每一步均提供了主要的源代码, 上述分析内容对有关的软件开发实践有良好的借鉴意义。

关键词:.NET,验证码,图像,C#

参考文献

[1]Anders Hejlsberg, Mads Torgersen, Scott Wiltamuth, Peter Golde.C#程序设计语言[M].机械工业出版社, 2010.

上一篇:数据分析观念培养下一篇:绘画情感