C#入门学习

四大利器的了解。

(1)LINQ技术将传统查询语言(如SQL)和传统开发语言(如C#)集成到一起,使得对内存数据的查询更加高效、语法更加简单。这种变革涉及LINQ语法、LINQ to ADO。NET和LINQ toXML等技术。

(2)WPF是创建华丽用户界面的基本技术,让用户的windows界面像Vista系统一样。WPF能开发什么东西呢?

                  WPF应用程序:独立可执行应用程序,类似exe应用程序。

                  WPF浏览器应用程序:基于XAML的浏览器的应用程序(好似B/S应用程序)。

                  WPF用户控件库:用于创建可重用的、组件化的用户控制库。

                  WPF自定义控件库:用于开发WPF自定义控件的控件库项目。

(3)WCF(windows Communication Foundation)作为微软对SOA(Service Oriented Architecture,面向服务)这一热潮的回应,成为了.NET

3.5中最为重要的组成部分之一。

        WCF是不是SOA?是不是面向服务的编程?这个疑问从一开始就有很多人提出来。的确,WCF简化了SOA面向服务开发技术,并且支持跨区域、跨服务器的各种分布式开发,也支持未来的开发模式,想不学习都难!面向服务开发,就是一个程序调用的服务可能来自不同的服务器。

(4)WF就是工作流,所有做过OA系统的人都知道,所有做过项目的人都知道,任何一个系列头离不开流程,如项目的初期规划、项目的进度、项目的管理资源分配。WF都能给你一个完美的解决方案。

C#开发语言大致了解

C#的开发方向涉及了几乎所有的领域,如窗体开发、网络开发、手机开发、通信开发、数据库开发等。

C#基于。NET框架之上,只需要学习两部分内容:语法基础和如何调用库类。

C#开发语言会越来越犀利,它已经结合了Visual Basic的快速开发功能和Java的快速安全功能,但它还是不能具备与平台无关性。

C#具有语法表现能力强、简单易学的特点,同时微软提供的visual studio开发工具,能帮助开发人员快速、方便地找到各种错误、技巧和方法与类的定义,而且visual studio还集成编码、调试、测试为一体。

 常量:

常量一般是程序中不变的数据,如“2”、“中国”等。常量也有不同的类型,如“2”属于数值型,而“中国”属于字符型。在c#中定义常量的语法如下:

public const string CHINA="中国";

上述代码中,const是定义常量的标识,如果没有此标识,即使为CHINA指定固定的值,也不算是常量。string用来定义常量的类型。注意常量在命名时,通常使用大写字母。

变量:

变量就是经常发生变化的数据。C#中定义变量的语法如下所示。

public int count=10;

变量可以不需要初始值,如下所示的定义也是正确的。

public int count;

变量的类型

C#中变量类型可以概括为3种:文本类型、数值类型和其他类型。

(1)文本类型主要包括string和char。其中,string用来存放字符串,char用来存放单个字符,两者的定义语法如下所示。其中,string变量的值用双引号引起来,而char变量的值用单引号引起来。

string name="北京欢迎你";

char word='word';

 (2)数值类型包含的内容比较多,如整形、浮点数、长整数等。

(3)其他类型主要包括日期型、object类型和布尔型。其中,object是c#的通用类型,C#中所有的类型都是从object发展而来。

变量的作用域和生存周期

变量并不是在程序的整个运行过程中都有效,其具备作用域和生命周期。

作用域是指变量在某一范围内有效,其相对于定义状态,即在代码中调用时的状态。如方法中的变量,只能在此方法中被调用。

生命周期则是相对于运行状态,即程序运行此方法时,方法中的变量有效。当程序运行完此方法后,方法中的变量也就消失了。

变量按照作用域被划分为3种:全局变量、局部变量和静态变量。

(1)全局变量:全局变量的作用域覆盖整个应用程序。使用public关键字定义变量,语法如下所示。

public string ApplicationName="财务系统";

(2)局部变量:一般在方法窗体中定义,其作用域就是所在的窗体。使用private关键字定义变量,语法如下所示。

private string FormName="人员管理";

(3)静态变量:静态变量可以在方法内定义,也可以在窗体内定义,其作用域等同于全局变量。使用static定义静态变量,语法如下所示。

private static string UserName=""张三; 

foreach语句

 foreach也是一个循环,通常用其实现对集合的遍历。因为此循环的条件不是布尔表达式,而是获取集合中的所有对象。

 foreach的使用语法如下:

foreach(集合个例 变量名 in 集合)

下面的代码演示了一个字符串数组的遍历过程

//定义一个字符串数组

string[] arrayStr=new string[]{"北京","上海","深圳"};

string strLong="";

foreach(string str in arrayStr){

     strLong=strLong+str;

}

label2.Text=strLong;

函数的重载

函数重载是指同一个函数名可以对应着多个函数的实现。如一个Add函数,即可以返回2个数值型的和,也可以返回2个字符型数据的和。这就说明Add函数被“重载”了。注意重载的两个知识点:函数同名,参数不同。其实,当应用程序调用函数时,就是通过参数来判断运行哪个函数。

委托

委托是一种引用方法的类型。一旦为委托分配了方法,委托将与该方法具有完全相同的行为。委托方法的使用可以像其他任何方法一样,具有参数和返回值。委托的使用语法如下:

public delegate int PerformCalculation(int x,int y);

委托的关键字是delegate,主要功能是安全地封装方法的类型。其将方法作为参数进行引用的能力,使委托成为定义回调方法的理想选择。

注意:委托引用的方法,必须与委托具备同样的返回类型和同样的参数类型。

委托的概念比较抽象。下面的实例演示如何创建委托,并实现委托的调用。

public delegate void OwnPring(string text);//定义委托

public void Print(String message)             //定义方法

{

     MessageBox.show(message);

}

     OwnPrint myprint=print;//委托方法

     myprint("欢迎您到北京来");

所有类型的基类型:System.Object

CLR(通用语言运行时)要求每个类型最终都要继承自System.Object类型。这意味着下面两种类型定义(使用C#描述)是等同的:

//隐式继承Object

class Employee{

        ...

}

//显式继承Object

class Employee:System.Object{

        ...

}

因为每个类型最终都会继承自System.Object,所以我们就可以确保任何对象都有一组方法的最小集合。

CLR要求所有的对象都要用new操作符来创建(该操作符将产生newobj IL指令)。下面的语句展示了怎样创建一个Employee对象:

Employee e=new Employee("constructiorParam1");

下面是new操作符所执行的工作:

1.从托管堆(managed heap)中分配指定类型所需数量的字节来作为存储其对象的内存空间。

2.初始化对象的附加成员(overhead menbers)。每一个对象实例都有两个附加成员。其中第一个成员为指向类型方法表的指针。第二个成员为SyncBlockIndex(译注:CLR使用该字段来进行线程同步控制。改字段的某些位还用作垃圾收集时的标记。另外FCL中System.object类型默认的GetHashCode方法也用到了该字段)。CLR使用这两个成员来管理对象实例。

3.传入new操作符中指定的参数(上面的例子为“ContructorParam1”),调用类型的实例构造器。虽然大多数语言在编译构造器时都会要求他们调用基类型中相应的构造器,但CLR本身没有这样的要求。

在new完成所有这些操作后,它将返回一个指向新创建对象的引用。在上面的例子中,该引用被保存在变量e中,其类型为Employee。

类型转换

CLR最重要的一个特性就是类型安全,CLR在运行时总能知道一个对象的类型。我们也可以通过调用GetType方法来得到对象的准确类型。因为该方法是一个非虚方法,所以我们不可能利用它来篡改一个类型的信息。例如,我们不可能重写Employee类的GetType方法使之返回一个SpaceShuttle类型。

开发人员经常会发现需要将一个对象转换为其他类型。各个编程语言自己决定如何提供这些转型操作。例如,C#不需要任何特殊的语法就可以将对象转换为其任何一个基类型,因为转换为基类型被认为是安全的隐式操作。然而在将对象转换为它的任何派生类型时,C#要求进行显式转型,因为这样的转型有可能会失败。

在运行时,CLR会检查转型操作以确保总是将对象转型它的实际类型、或者它的任何基类型。例如,下面的代码虽然能够通过编译,但在运行时,却会抛出InvalidCastException异常:

class Manager:Employee{

        。。。

}

class App{

       public static void Main(){

       //构造一个manager对象并将其传递给PromoteEmployee.

       //一个Manage“IS-A”Object,PromoteEmployee将正常运行

     Manager m=new Manager();

     PromoteEmployee(m);

       //构造一个DateTime对象并将其传递给PromoteEmployee。

       //由于DateTime并非继承自Employee,因此PromoteEmployee

       //会抛出一个System.InvalidCastException异常

       DateTime newYears=new DateTime(2001,1,1);

       PromoteEmployee(newYears);

       }

}

public static void PromoteEmployee(Object o){

       //这里,编译器并不知道对象o引用的实际类型。

       //所以编译器允许代码通过编译。然而,在运行时,

       //CLR会获知o引用的类型(每当进行转型操作时),

        //并且会检查对象的类型是否为Employee,或则任何

       //继承自Employee的类型

       Employee e=(Employee)o;

        ...

}

 使用is和as操作符转型

 C#提供了一种利用is操作符进行转型的方式。它可以检查对象是否和给定的类型兼容,并返回判断结果:true或则false。另外,is操作符永远不会抛出异常。看下面的代码:

System.Object o=new System.Object();

System.Boolean b1=(o is System.Object);//b1为true

System.Boolean b2=(o is Employee);//b2为false

如果对象引用为null,那么is操作符总是返回false,因为没有对象可以用来检查其类型。下面演示了is操作符典型的使用方法:

if(o is Employee){

       Employee e=(Employee)o;

       //在if语句中使用e 

}

在上面的代码中,CLR实际上对对象的类型检查了两次:is操作符首先检查o所引用的对象是否和Employee类型兼容。如果兼容,在if语句内,CLR在执行转型时又会检查o是否为一个Employee引用。由于这种编程范式十分常见,C#便为我们提供了一种新的类型转型方式,即as操作符,它可以在简化代码的同时提高性能。看看下面的代码:

Employee e=o as Employee;

if(e!=null){

       //在if语句中使用e

}

在上面的代码中,CLR会检查o所引用的对象是否和Employee类性兼容。如果兼容,as返回一个指向同一个对象的非空指针。如果不兼容,as返回null。注意,在as操作符执行过程中,CLR只检查了一次对象的类型。紧接着的if语句只需要检查e是否为null就可以了---这种检查要比检查对象的类型高效得多。

原文地址:https://www.cnblogs.com/yjrl/p/1656595.html