C#3.0(1)基础知识

来源:互联网 发布:java.awt.color rgb 编辑:程序博客网 时间:2024/05/22 03:39

 

1.    隐含类型局部变量

 

var i = 5;

var h=23.56;

var s = “C Sharp";

var intArr = new[] {1,2,3,4} ;

var a = new[] { 1, 10, 100, 1000 };// int[]

var 为关键字,可以根据后面的初始化语句自动推断类型

初始化语句必须为表达式,且编译时可以推断类型。得到var的类型。

-------初始化不能够是对象,也不能是集合的初始化器,还不能够为空。也就是说,编译器必须能够从右边推断出类型,否则编译出错。

• var声明的仅限于局部变量,亦可以用于foreach , using 等语句中。

------或者是在函数内部。

数组也可以作为隐含类型。

------var不是一个类型,只能说是一个占位符号,在编译的时候,替换具体的类型,因此,他还是强类型语言,而不是弱类型语言。

 

主要是提高了代码的抽象性,代码重用率性。

 

 

2. 扩展方法

 

public static class Extensions{

public static void Foo(this string s) {

…..

}

}

String s=“Hello,World”;

s.Foo(); //在调用的时候转换为:Extensions.Foo(s); 由实例方法转换为静态方法。

 

如:class person{

public vod Bar(){…}   //编译的时候转换为Bar(person this),编译之后不区分类、静态函数、对象等。所有的函数都转换为全局函数。也就是说对于编译器而言,函数所属的实例或者参数最终都会变成变量。由此,s.Foo()很容易转换为Foo(s)

}

Person p = new person();

p.Bar();

 

扩展方法要点

扩展方法的本质为将实例方法调用在编译时改变为静态类中的静态方法调用

注意扩展方法的优先级:现有实例方法优先级最高,其次为最近的namespace下的静态类的静态方法(是否在相同的命名空间),最后为较远的namespace下的静态类的静态方法

扩展方法是一种编译时技术,注意与反射等运行时技术进行区别,并慎重使用。

 

扩展方法允许我们在不改变源代码的情况下扩展(即添加现有类型中的实例方法

 

拓展类的传统方法:

1.       继承或者多态:扩展他的方法和属性等。

2.       组合:把类实例作为其成员

3.       反射:动态的给一个类型添加更多的行为。

4.       扩展:只允许添加,不允许修改和缩减。

 

在使用扩展方法时,一般新建一个扩展类,对该类型实例方法进行一组扩展,而不能够在多处对该类型进行扩展。

 

3. 对象与集合初始化器

 

对象初始化:

public class Point {

int x, y;

public int X { get { return x; } set { x = value; } }

public int Y { get { return y; } set { y = value; } }

}

var a = new Point { X = 0, Y = 1 }; //注意属性x,y必须是公有的。

相当于:var a = new Point(); a.X = 0; a.Y = 1;

 

集合初始化器:

List<int> num= new List<int> {0, 1, 2, 6, 7, 8, 9};

 

对象与集合初始化器要点

对象初始化器实际上利用了编译器对对象中对外可见的字段和属性进行按序赋值.

集合初始化器会对初始化器中的元素进行按序调用ICollection<T>.Add(T)

注意对象初始化器和集合初始化器中成员的可见性和调用顺序

对象与集合初始化器同样是一种编译时技术。

 

5. 匿名类型(无类型)

 

var p1 = new { Name = "Lawnmower", Price = 495.00 }

var p2 = new { Name = "Shovel", Price = 26.95 };

p1 = p2;

可以使用new关键字调用匿名初始化器创建一个匿名类型的对象。

匿名类型直接继承自System.Object

匿名类型的成员是编译器根据初始化器推断而来的一些读写属性。

-

---- var p1 = new { Name = "Lawnmower", Price = 495.00 }

//在编译的时候转换为:

Class someType{

                     Sring _name;

                     Double _price;

                     Public string name{get{return name} set {_name =value}}

                     Public double price{get{return price} set {_price = value}}

}

------一般是在程序的小范围内使用这些类型(如用户需要临时创建一种类型,有类似于一个需要一个系统没有定义的临时变量,而自定义一个匿名类型),而不是在大范围使用这些类型。我们才使用匿名类型,提高了智能化人性化

 

 

附加:

1. 强类型 VS 弱类型:

1)强类型定义语言:强制数据类型定义的语言。也就是说,一旦一个变量被指定了某个数据类型,如果不经过强制转换,那么它就永远是这个数据类型了。举个例子:如果你定义了一个整型变量a,那么程序根本不可能将a当作字符串类型处理。强类型定义语言是类型安全的语言。

 

2)弱类型定义语言:数据类型可以被忽略的语言。它与强类型定义语言相反, 一个变量可以赋不同数据类型的值。

 

2.反射机制:

反射的概念是由Smith1982年首次提出的,主要是指程序可以访问、检测和修改它本身状态或行为的一种能力。这一概念的提出很快引发了计算机科学领域关于应用反射性的研究。它首先被程序语言的设计领域所采用,并在Lisp和面向对象方面取得了成绩。其中LEAD/LEAD++ OpenC++ MetaXaOpenJava等就是基于反射机制的语言。最近,反射机制也被应用到了视窗系统、操作系统和文件系统中。

反射本身并不是一个新概念,它可能会使我们联想到光学中的反射概念,尽管计算机科学赋予了反射概念新的含义,但是,从现象上来说,它们确实有某些相通之处,这些有助于我们的理解。在计算机科学领域,反射指一类应用,它们能够自描述和自控制。也就是说,这类应用通过采用某种机制来实现对自己行为的描述(self-representation)和监测(examination),并能根据自身行为的状态和结果,调整或修改应用所描述行为的状态和相关的语义。可以看出,同一般的反射概念相比,计算机科学领域的反射不单单指反射本身,还包括对反射结果所采取的措施。所有采用反射机制的系统(即反射系统)都希望使系统的实现更开放。可以说,实现了反射机制的系统都具有开放性,但具有开放性的系统并不一定采用了反射机制,开放性是反射系统的必要条件。一般来说,反射系统除了满足开放性条件外还必须满足原因连接(Causally-connected。所谓原因连接是指对反射系统自描述的改变能够立即反映到系统底层的实际状态和行为上的情况,反之亦然。开放性和原因连接是反射系统的两大基本要素。

Java中,反射是一种强大的工具。它使您能够创建灵活的代码,这些代码可以在运行时装配,无需在组件之间进行源代表链接。反射允许我们在编写与执行时,使我们的程序代码能够接入装载到JVM中的类的内部信息,而不是源代码中选定的类协作的代码。这使反射成为构建灵活的应用的主要工具。但需注意的是:如果使用不当,反射的成本很高。

 
原创粉丝点击